Re: Serial data type - Mailing list pgsql-novice

From Andrew Hammond
Subject Re: Serial data type
Date
Msg-id 425EC898.5010703@ca.afilias.info
Whole thread Raw
In response to Re: Serial data type  ("Walker, Jed S" <Jed_Walker@cable.comcast.com>)
List pgsql-novice
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Be aware that this can blow up in your face when you use it in
conjunction with a naive connection pool. You're better off to do

SELECT nextval('person_id_seq') AS new_id;

Then...

INSERT INTO person (person_id, name) VALUES (new_id, 'Some guy');

- --
Andrew Hammond    416-673-4138    ahammond@ca.afilias.info
Database Administrator, Afilias Canada Corp.
CB83 2838 4B67 D40F D086 3568 81FC E7E5 27AF 4A9A


Walker, Jed S wrote:
> Thanks Michael,
>
> I see the
>
> execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
>     new_id = execute("SELECT currval('person_id_seq')");
>
> Would work great for the serial type.
>
> I appreciate your help.
>
> -----Original Message-----
> From: Michael Fuhr [mailto:mike@fuhr.org]
> Sent: Wednesday, April 13, 2005 10:11 AM
> To: Walker, Jed S
> Cc: 'pgsql-novice@postgresql.org'
> Subject: Re: [NOVICE] Serial data type
>
> On Wed, Apr 13, 2005 at 09:30:09AM -0600, Walker, Jed S wrote:
>
>>I have several tables that require auto-generated Ids. I have noticed
>>the serial and bigserial data types (or pseudo-types). These seem like
>>they make things much simpler, but if you use this, how can you find
>>out the the value of the serial column after you insert a row? Do you
>>have to lookup the primary key or is it stored in a session variable or
>
> some other place?
>
> See "Sequence Manipulation Functions" in the "Functions and Operators"
> chapter of the documentation.  This is also mentioned in the FAQ.
>
> http://www.postgresql.org/docs/8.0/interactive/functions-sequence.html
> http://www.postgresql.org/docs/faqs.FAQ.html#4.11.2
>
>
>>Is it better to define the sequence manually and just select it out by
>>hand before doing the insert?
>
>
> That depends on how you define "better."  Whether you define the sequence
> manually or not doesn't affect how you can use it: in either case you can
> explicitly obtain a value from it, and in either case you can define a
> column to have a default value that comes from the sequence.
>
> One effect of defining a serial column is that recent versions of PostgreSQL
> know about the dependency between the table and the sequence, so if you drop
> the table then the sequence automatically gets dropped too, and if you try
> to drop a sequence then you'll get an error if a table depends on it.
>
> Whether you insert first or get the sequence value first seldom matters;
> it's usually personal preference.  An exception is when you're not sure that
> separate SQL statements will be run over the same connection (e.g., if
> you're using a connection pool), in which case you'll probably need to
> obtain the sequence value first -- otherwise you might get an error or the
> wrong value when you query for the sequence value from the last insert.
>
> --
> Michael Fuhr
> http://www.fuhr.org/~mfuhr/
>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)

iD8DBQFCXsiYgfzn5SevSpoRApoKAJ9auIO5XcN6/OTts/upTLSH7KbpPQCdHYjd
H+Ic4CCiHeMmHUeDw8ll/DA=
=iXZV
-----END PGP SIGNATURE-----

pgsql-novice by date:

Previous
From: "Luiz K. Matsumura"
Date:
Subject: Re: JOIN on a lookup table
Next
From: Andrew Hammond
Date:
Subject: Re: Problems on "copy" statement