Thread: sequence value of the record just inserted.

sequence value of the record just inserted.

From
Ben Kim
Date:
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


Re: sequence value of the record just inserted.

From
"scott.marlowe"
Date:
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.


Re: sequence value of the record just inserted.

From
jseymour@LinxNet.com (Jim Seymour)
Date:
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

Re: sequence value of the record just inserted.

From
Ben Kim
Date:
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



Re: sequence value of the record just inserted.

From
"Greg Sabino Mullane"
Date:
-----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-----