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

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

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

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

【问题讨论】:

标签: postgresql


【解决方案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:你是对的,没有任何意义。我改了。
猜你喜欢
  • 2016-03-06
  • 1970-01-01
  • 2011-12-31
  • 2017-09-08
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2014-07-17
相关资源
最近更新 更多