serial
to „stara” implementacja automatycznie generowanych unikalnych wartości, która od wieków była częścią Postgresa. Nie jest to jednak część standardu SQL.
Aby być bardziej zgodnym ze standardem SQL, Postgres 10 wprowadził składnię używającą generated as identity
.
Podstawowa implementacja nadal opiera się na sekwencji, definicja jest teraz zgodna ze standardem SQL. Jedną z rzeczy, na którą pozwala ta nowa składnia, jest zapobieganie przypadkowemu nadpisaniu wartości.
Rozważ następujące tabele:
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
Teraz, gdy biegasz:
insert into t1 (id) values (1);
Podstawowa sekwencja i wartości w tabeli nie są już zsynchronizowane. Jeśli uruchomisz inny
insert into t1 default_values;
Otrzymasz błąd, ponieważ sekwencja nie została zaawansowana przy pierwszym wstawieniu, a teraz próbuje wstawić wartość 1
ponownie.
Jednak w przypadku drugiej tabeli
insert into t2 (id) values (1);
Wyniki w:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
Możesz więc przypadkowo „zapomnieć” o użyciu sekwencji. Nadal możesz to wymusić, używając override system value
opcja:
insert into t2 (id) overriding system value values (1);
co nadal pozostawia ci sekwencję niezsynchronizowaną z wartościami w tabeli, ale przynajmniej zostałeś o tym świadomy.
Zaleca się używanie nowej składni tożsamości zamiast serialu