要在表上有一个整数自动编号主键,可以使用SERIAL
但我注意到information_schema.columns
表有identity_
个字段,实际上,你可以用create a column with a GENERATED
specifier个...
有什么区别?它们是用不同的PostgreSQL版本引入的吗?一个优先于另一个吗?
要在表上有一个整数自动编号主键,可以使用SERIAL
但我注意到information_schema.columns
表有identity_
个字段,实际上,你可以用create a column with a GENERATED
specifier个...
有什么区别?它们是用不同的PostgreSQL版本引入的吗?一个优先于另一个吗?
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);
现在当你 run 时:
insert into t1 (id) values (1);
基础序列和表中的值不再同步.如果你经营另一家
insert into t1 default_values;
您将得到一个错误,因为序列在第一次插入时没有前进,现在try 再次插入值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来使用新的标识语法,而不是串行