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);
这仍然会给您留下与表中的值不同步的序列,但至少您已经意识到这一点。
It is recommended 使用新的身份语法而不是串行