要在表上使用整数自动编号主键,可以使用SERIAL
但是我注意到表information_schema.columns
有许多identity_
字段,实际上,您可以create a column with a GENERATED
specifier ...
有什么区别?他们引入了不同的PostgreSQL版本吗?是一个比另一个更好的选择吗?
答案 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);
仍然会使您的序列与表中的值不同步,但是至少您已经意识到这一点。