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