serial
er den "gamle" implementering af auto-genererede unikke værdier, som har været en del af Postgres i evigheder. Det er dog ikke en del af SQL-standarden.
For at være mere kompatibel med SQL-standarden introducerede Postgres 10 syntaksen ved hjælp af generated as identity
.
Den underliggende implementering er stadig baseret på en sekvens, definitionen er nu i overensstemmelse med SQL-standarden. En ting, som denne nye syntaks tillader, er at forhindre en utilsigtet tilsidesættelse af værdien.
Overvej følgende tabeller:
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
Nu når du kører:
insert into t1 (id) values (1);
Den underliggende sekvens og værdierne i tabellen er ikke længere synkroniserede. Hvis du kører en anden
insert into t1 default_values;
Du får en fejl, fordi sekvensen ikke blev avanceret af den første indsættelse, og nu forsøger at indsætte værdien 1
en gang til.
Med den anden tabel dog
insert into t2 (id) values (1);
Resultater i:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
Så du kan ved et uheld "glemme" sekvensbrugen. Du kan stadig gennemtvinge dette ved at bruge override system value
mulighed:
insert into t2 (id) overriding system value values (1);
hvilket stadig efterlader dig med en sekvens, der er ude af sync med værdierne i tabellen, men i det mindste blev du gjort opmærksom på det.
Det anbefales at bruge den nye identitetssyntaks i stedet for seriel