Re: Primary key data type: integer vs identity

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: Ken Tanzer <ken(dot)tanzer(at)gmail(dot)com>
Cc: Rich Shepard <rshepard(at)appl-ecosys(dot)com>, "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: Primary key data type: integer vs identity
Date: 2019-04-19 19:02:03
Message-ID: 4d387c8e-a261-0734-a10f-dfde7ce538f0@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 4/19/19 11:32 AM, Ken Tanzer wrote:
> On Fri, Apr 19, 2019 at 11:20 AM Adrian Klaver
> <adrian(dot)klaver(at)aklaver(dot)com <mailto:adrian(dot)klaver(at)aklaver(dot)com>> wrote:
>
> On 4/19/19 11:14 AM, Rich Shepard wrote:
> > On Fri, 19 Apr 2019, Adrian Klaver wrote:
> >
> >> If it is working for you now I see no reason to switch.
> >
> > Adrian,
> >
> > It does work. I just learned about the SQL identity type and want
> to learn
> > when it's most appropriate to use. The databases I develop all
> work with
> > integers as primary keys and reading about the type didn't
> clarify (for me)
> > when it should be used.
>
> Mainly for folks that want cross database SQL compliance. It is not a
> type so much as a way of specifying an auto-increment column.
>
>
> It also sounds like it has advantages in terms of tying your sequence
> directly to the column.  If you drop a serial column, it doesn't drop
> the sequence.

A serial column will:

test=> create table serial_test(id serial);
CREATE TABLE
test=> \d serial_test
Table "public.serial_test"
Column | Type | Collation | Nullable | Default

--------+---------+-----------+----------+-----------------------------------------
id | integer | | not null |
nextval('serial_test_id_seq'::regclass)

test=> select * from serial_test_id_seq ;
last_value | log_cnt | is_called
------------+---------+-----------
1 | 0 | f
(1 row)

test=> drop table serial_test ;
DROP TABLE

test=> select * from serial_test_id_seq ;

ERROR: relation "serial_test_id_seq" does not exist

LINE 1: select * from serial_test_id_seq ;

If you just use a sequence as a default value it will not unless you
make it OWNED by the table per the link I posted upstream.

> Once I've upgraded to 10+, I might look at converting my existing serial
> columns.  Peter Eisentraut wrote a good piece(1) on identity columns,
> including a function for converting existing serial columns.  I've
> copied the function below, but had two questions about it:
>
> 1)  Would the function as written also reassign ownership to that table
> column?  (I see the update to pg_depend and pg_attribute, but don't know
> enough about them to know if that changes ownership)
> 2)  Would one have to be a superuser to do this?
>
> Thanks,
> Ken

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2019-04-19 19:07:36 Re: Primary key data type: integer vs identity
Previous Message Rich Shepard 2019-04-19 18:54:05 Re: Primary key data type: integer vs identity