Thread: retrieving a serial number
I have one table (call it "master") that, among other things, contains a serial number. I have a number of other tables (call them "slaves") that, among other things, contain a foreign key referring to the serial number in the first table. I will be inserting one row into the master table, and one row into zero or more slave tables in each transaction. What I want to do is use a sequence in the master table to let PostgreSQL automatically generate a unique serial number for me, but I need to know the serial number in order to insert the corresponding rows into the slave table(s). Is there any way of retrieving the serial number that will be used before the transaction has been committed? Or will I have to generate my own serial numbers? Michael Lea Information Security Manitoba Public Insurance Phone: (204) 985-8224
There's probably a way to get that serial number. I think I remember reading that when you specify it as SERIAL, postgresql actually creates a separate sequence. If that's the case then you could do "SELECT currval('mysequence')" -- although I'm not sure what "mysequence" should be set to. The other way to do it would be to remove the SERIAL attribute from the table, making it an INT4 (or whatever) and then create a separate sequence...so... SELECT nextval('mysequence'); insert into master... (using the value returned from above) insert into slave... (using the value returned from above) insert into slave... (using the value returned from above) insert into slave... (using the value returned from above) insert into slave... (using the value returned from above) would work just fine. In article <am.pgsql.sql.962213794.3300@illiad.adhesivemedia.com>, Lea, Michael <MLea@mpi.mb.ca> wrote: >I have one table (call it "master") that, among other things, contains a >serial number. I have a number of other tables (call them "slaves") that, >among other things, contain a foreign key referring to the serial number in >the first table. I will be inserting one row into the master table, and one >row into zero or more slave tables in each transaction. >What I want to do is use a sequence in the master table to let PostgreSQL >automatically generate a unique serial number for me, but I need to know the >serial number in order to insert the corresponding rows into the slave >table(s). Is there any way of retrieving the serial number that will be used >before the transaction has been committed? Or will I have to generate my own >serial numbers? >Michael Lea >Information Security >Manitoba Public Insurance >Phone: (204) 985-8224
You can do something like this: $var = SELECT nextval('seq_name'); INSERT INTO master (id, ...) VALUES ($var, ...); INSERT INTO slave1 (id, ...) VALUES ($var, ...); ... You can do a \d master, in psql to find out the name of the sequence. For the SERIAL type, nextval('seq_name') is just its default anyway. On Wed, 28 Jun 2000, Lea, Michael wrote: > I have one table (call it "master") that, among other things, contains a > serial number. I have a number of other tables (call them "slaves") that, > among other things, contain a foreign key referring to the serial number in > the first table. I will be inserting one row into the master table, and one > row into zero or more slave tables in each transaction. > > What I want to do is use a sequence in the master table to let PostgreSQL > automatically generate a unique serial number for me, but I need to know the > serial number in order to insert the corresponding rows into the slave > table(s). Is there any way of retrieving the serial number that will be used > before the transaction has been committed? Or will I have to generate my own > serial numbers? > > Michael Lea > Information Security > Manitoba Public Insurance > Phone: (204) 985-8224 -- Robert B. Easter
"Robert B. Easter" <reaster@comptechnews.com> writes: > You can do something like this: > $var = SELECT nextval('seq_name'); > INSERT INTO master (id, ...) VALUES ($var, ...); > INSERT INTO slave1 (id, ...) VALUES ($var, ...); Great feaure. What to do when importing some previous data from ascii files -- can you automatically give a serial number in this way to? Thanks in advance, joachim