serial
is de "oude" implementatie van automatisch gegenereerde unieke waarden die al eeuwenlang deel uitmaakt van Postgres. Dat maakt echter geen deel uit van de SQL-standaard.
Om beter te voldoen aan de SQL-standaard, introduceerde Postgres 10 de syntaxis met behulp van generated as identity
.
De onderliggende implementatie is nog steeds gebaseerd op een volgorde, de definitie voldoet nu aan de SQL-standaard. Een ding dat deze nieuwe syntaxis mogelijk maakt, is om te voorkomen dat de waarde per ongeluk wordt overschreven.
Bekijk de volgende tabellen:
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
Als je nu rent:
insert into t1 (id) values (1);
De onderliggende volgorde en de waarden in de tabel lopen niet meer synchroon. Als u een andere
insert into t1 default_values;
U krijgt een foutmelding omdat de reeks niet is gevorderd bij de eerste invoeging en nu probeert de waarde 1
in te voegen nog een keer.
Met de tweede tafel echter,
insert into t2 (id) values (1);
Resultaten in:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
U kunt dus per ongeluk het volgordegebruik "vergeten". Je kunt dit nog steeds forceren met behulp van de override system value
optie:
insert into t2 (id) overriding system value values (1);
waardoor je nog steeds een reeks hebt die niet synchroon loopt met de waarden in de tabel, maar je bent daar tenminste van op de hoogte gebracht.
Het wordt aanbevolen om de nieuwe identiteitssyntaxis te gebruiken in plaats van serieel