serial
е "старата" реализация на автоматично генерирани уникални стойности, която е част от Postgres от векове. Това обаче не е част от стандарта SQL.
За да бъде по-съвместим със стандарта SQL, Postgres 10 въведе синтаксиса, използвайки generated as identity
.
Основната реализация все още се основава на последователност, дефиницията вече е в съответствие със стандарта SQL. Едно нещо, което този нов синтаксис позволява, е да се предотврати случайно замяна на стойността.
Помислете за следните таблици:
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
Сега, когато стартирате:
insert into t1 (id) values (1);
Основната последователност и стойностите в таблицата вече не са синхронизирани. Ако стартирате друг
insert into t1 default_values;
Ще получите грешка, защото последователността не е била напреднала от първото вмъкване и сега се опитва да вмъкне стойността 1
отново.
С втората таблица обаче,
insert into t2 (id) values (1);
Резултати в:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
Така че можете случайно да "забравите" използването на последователността. Все още можете да принудите това, като използвате override system value
опция:
insert into t2 (id) overriding system value values (1);
което все още ви оставя с последователност, която не е синхронизирана със стойностите в таблицата, но поне сте били наясно с това.
Препоръчително е да използвате новия синтаксис на идентичността, а не сериен