serial
è la "vecchia" implementazione di valori unici generati automaticamente che fa parte di Postgres da secoli. Tuttavia questo non fa parte dello standard SQL.
Per essere più conforme allo standard SQL, Postgres 10 ha introdotto la sintassi usando generated as identity
.
L'implementazione sottostante è ancora basata su una sequenza, la definizione ora è conforme allo standard SQL. Una cosa che questa nuova sintassi consente è di impedire una sovrascrittura accidentale del valore.
Considera le seguenti tabelle:
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
Ora quando corri:
insert into t1 (id) values (1);
La sequenza sottostante ei valori nella tabella non sono più sincronizzati. Se ne esegui un altro
insert into t1 default_values;
Riceverai un errore perché la sequenza non è stata avanzata dal primo inserimento e ora prova a inserire il valore 1
ancora.
Con la seconda tabella, invece,
insert into t2 (id) values (1);
Risultati in:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
Quindi puoi accidentalmente "dimenticare" l'utilizzo della sequenza. Puoi ancora forzarlo, usando il override system value
opzione:
insert into t2 (id) overriding system value values (1);
che ti lascia ancora con una sequenza non sincronizzata con i valori nella tabella, ma almeno ne sei stato informato.
Si consiglia di utilizzare la nuova sintassi di identità anziché seriale