要在表上有一个整数自动编号主键,可以使用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来使用新的标识语法,而不是串行

Postgresql相关问答推荐

复合索引列的顺序导致不同的计划

如何删除Devtainer之前创建的PostgreSQL数据库?

Npgsql中准备好的语句和参数化查询有什么区别?

如何计算每月的出版物数量?

如何在plpgsql中找到一行中的最大值?

错误:分区表的唯一约束必须包括所有分区列

为什么我使用 VBA 只能从 postgres 获得 10 行?

安装 pg gem 失败,mkmf.rb 找不到 ruby​​ 的头文件(Mac OSX 10.6.5)

Postgresql JSONB 来了.现在用什么?Hstore?JSON?EAV?

PostgreSQL 中基于时间戳的移动平均线

如何从元组列表中 Select 与多列匹配的行?

Mac psql/readline - 未加载库

如何使用字符串作为 PostgreSQL 咨询锁的键?

我不明白 postgresql 的 nextval() 是如何工作的,有人可以解释一下吗?

SQL - 提示引用列

manage.py 迁移时必须是关系 django_site 的所有者

获取 psycopg2 count(*) 结果数

从长时间的postgres转换日期

Rails PG::UndefinedTable:错误:missing FROM-clause entry for table

将postgres中的所有记录转换为Titlecase,首字母大写