serial
je "stará" implementace automaticky generovaných jedinečných hodnot, která je součástí Postgresu po věky. To však není součástí standardu SQL.
Aby byl Postgres 10 více v souladu se standardem SQL, zavedl syntaxi pomocí generated as identity
.
Základní implementace je stále založena na sekvenci, definice nyní odpovídá standardu SQL. Jedna věc, kterou tato nová syntaxe umožňuje, je zabránit náhodnému přepsání hodnoty.
Zvažte následující tabulky:
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
Nyní, když spustíte:
insert into t1 (id) values (1);
Základní sekvence a hodnoty v tabulce již nejsou synchronizované. Pokud spustíte další
insert into t1 default_values;
Dostanete chybu, protože sekvence nebyla posunuta prvním vložením a nyní se pokouší vložit hodnotu 1
znovu.
S druhou tabulkou však
insert into t2 (id) values (1);
Výsledky v:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
Takže můžete omylem "zapomenout" na použití sekvence. Stále to můžete vynutit pomocí override system value
možnost:
insert into t2 (id) overriding system value values (1);
což vám stále ponechává sekvenci, která není synchronizována s hodnotami v tabulce, ale alespoň jste na to byli upozorněni.
Doporučuje se používat novou syntaxi identity spíše než sériové