PostgreSQL:串行与身份

Posted

技术标签:

【中文标题】PostgreSQL:串行与身份【英文标题】:PostgreSQL: serial vs identity 【发布时间】:2019-08-13 11:38:15 【问题描述】:

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

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

有什么区别?它们是用不同的 PostgreSQL 版本引入的吗?一个比另一个更受欢迎吗?

【问题讨论】:

dba.stackexchange.com/questions/158988/… 另外:***.com/questions/787722/postgresql-autoincrement - 但您的查询更多是 DBA 方面的 【参考方案1】:

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 使用新的身份语法而不是串行

【讨论】:

@Fleuv:你是对的,没有任何意义。我改了。

以上是关于PostgreSQL:串行与身份的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host

Postgresq9.6主从部署

PostgreSQL串行化隔离级别(SSI)的能力与实现

RedShift / PostgreSQL 中串行类型的替代方案

与 iOS 外部附件的串行通信(无身份验证协处理器)

postgresql 安装