'Identifier' columns

Started by David Favroover 7 years ago2 messagesgeneral
Jump to latest
#1David Favro
postgres@meta-dynamic.com

A couple of questions about auto-assigned identifier columns,
forgive my ignorance, I'm used to other methods to create IDs...

1. If creating a new application [i.e. no "legacy" reasons to do
anything] using PostgreSQL 10, when creating an "auto-assigned
integer ID" column, what are the advantages/disadvantages of using
the 'SERIAL' datatype [or equivalent explicitly created SEQUENCE w/
nextval() used as default for column] versus the SQL-standard
'integer GENERATED AS IDENTITY'? All other things being equal, it
would seem a no-brainer to follow the standard.

2. When using the SQL-standard 'integer GENERATED AS IDENTITY'
column, after inserting a column, what is the recommended method to
find the ID of the just-inserted row? Is there no SQL-standard way?
The docs seem to imply (without explicitly stating) that a SEQUENCE
is used behind the scenes hence 'currval()' could be used, but I
didn't see in the docs any mention of what the underlying sequence's
name is, or how to specify a name. Perhaps 'lastval()' would work,
but not in all cases and in any event it has a sloppy feel to me.

Thank you in advance for any advice that can be offered.

-- David

#2Laurenz Albe
laurenz.albe@cybertec.at
In reply to: David Favro (#1)
Re: 'Identifier' columns

David Favro wrote:

A couple of questions about auto-assigned identifier columns,
forgive my ignorance, I'm used to other methods to create IDs...

1. If creating a new application [i.e. no "legacy" reasons to do
anything] using PostgreSQL 10, when creating an "auto-assigned
integer ID" column, what are the advantages/disadvantages of using
the 'SERIAL' datatype [or equivalent explicitly created SEQUENCE w/
nextval() used as default for column] versus the SQL-standard
'integer GENERATED AS IDENTITY'? All other things being equal, it
would seem a no-brainer to follow the standard.

Absolutely.
Use GENERATED ALWAYS AS IDENTITY.

2. When using the SQL-standard 'integer GENERATED AS IDENTITY'
column, after inserting a column, what is the recommended method to
find the ID of the just-inserted row? Is there no SQL-standard way?
The docs seem to imply (without explicitly stating) that a SEQUENCE
is used behind the scenes hence 'currval()' could be used, but I
didn't see in the docs any mention of what the underlying sequence's
name is, or how to specify a name. Perhaps 'lastval()' would work,
but not in all cases and in any event it has a sloppy feel to me.

The best way is to use the (non-standard) RETURNING clause:

INSERT ... RETURNING id;

Yours,
Laurenz Albe
--
Cybertec | https://www.cybertec-postgresql.com