Обсуждение: sequence value of the record just inserted.
Dear admins, I have a table whose primary key is a record_id with serial type. I would like to know, when I insert a new row, what was the value of the record_id that I just inserted. Since this is a multi user application, I cannot simply select max of the record_id or currval of the sequence. I would appreciate an advice. Regards, Ben Kim
On Fri, 9 Apr 2004, Ben Kim wrote: > > Dear admins, > > I have a table whose primary key is a record_id with serial type. > > I would like to know, when I insert a new row, what was the value of the > record_id that I just inserted. Since this is a multi user application, I > cannot simply select max of the record_id or currval of the sequence. > > I would appreciate an advice. You want the functions for sequences: nextval, currval, and setval: http://www.postgresql.org/docs/7.4/static/functions-sequence.html nextval and currval are transactionally safe.
Ben Kim <bkim@coe.tamu.edu> wrote:
>
>
> Dear admins,
>
> I have a table whose primary key is a record_id with serial type.
>
> I would like to know, when I insert a new row, what was the value of the
> record_id that I just inserted. Since this is a multi user application, I
> cannot simply select max of the record_id or currval of the sequence.
You certainly can use currval();
In session #1 I do...
jseymour=> create table foo3 (bar serial, baz int);
jseymour=> insert into foo3 (baz) values (1);
This will put "1" in for column "bar".
In session #2 I do...
jseymour=> insert into foo3 (baz) values (1);
This will put "2" in for column "bar".
Now back to session #1...
jseymour=> select currval('foo3_bar_seq');
currval
---------
1
(1 row)
And session #2...
jseymour=> select currval('foo3_bar_seq');
currval
---------
2
(1 row)
HTH,
Jim
Thanks to those who offered help,
The suggested solutions are,
1. Select nextval('myseq'), then use the nextval as the new id to
insert a new record.
2. Insert a new record, then do select currval('myseq') or select last_val
from myseq; supposed to be safe
3. use transaction to guarantee safety
As for solution 2, I wonder what the scope of a "session" is. If I call a
perl subroutine from a web page (the subroutine opens a db handle and
closes it at the end of the subroutine), would it count as one session?
I'll need to check more but would appreciate it if anyone has a ready
advice on this aspect.
Also, in perl DBI, the solutions all require executing at least 2 sql
statements.
I initially hoped there'd be a way to get the oid or sequence number at
the same time as executing an INSERT (one sql statement), like I get oid
in psql. But I use perl DBI, so am not sure how I can get the oid into a
perl variable.
I appreciate the help.
Regards,
Ben Kim
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 > Also, in perl DBI, the solutions all require executing at least > 2 sql statements. Nothing wrong with that. > I initially hoped there'd be a way to get the oid or sequence number > at the same time as executing an INSERT (one sql statement), like I > get oid in psql. But I use perl DBI, so am not sure how I can get the > oid into a perl variable. See the documentation for pg_oid_status in DBD::Pg. - -- Greg Sabino Mullane greg@turnstep.com PGP Key: 0x14964AC8 200404142201 -----BEGIN PGP SIGNATURE----- iD8DBQFAfe07vJuQZxSWSsgRAsFgAKCw3NkMiZiwZb5gjxu1Q+Nj9wwkpACcDj1n gxSIKAGNJefZaJCmU6+tpgs= =GLPy -----END PGP SIGNATURE-----