PostgreSQL:串行与身份

时间:2019-03-22 13:10:30

标签: postgresql

要在表上使用整数自动编号主键,可以使用SERIAL

但是我注意到表information_schema.columns有许多identity_字段,实际上,您可以create a column with a GENERATED specifier ...

有什么区别?他们引入了不同的PostgreSQL版本吗?是一个比另一个更好的选择吗?

1 个答案:

答案 0 :(得分:6)

serial是自动生成的唯一值的“旧”实现,多年来一直是Postgres的一部分。但是,这不是SQL标准的一部分。

为了更符合SQL标准,Postgres 10引入了使用generated as identity的语法。

基础实现仍然基于序列,该定义现在符合SQL标准。新语法允许的一件事是防止意外覆盖该值。

请考虑以下表格:

create table t1 (id serial primary key);
create table t2 (id integer not null 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);

仍然会使您的序列与表中的值不同步,但是至少您已经意识到这一点。