GENERATED ALWAYS | 的限制是多少?默认情况下 作为 PostgreSQL 中的身份?

Posted

技术标签:

【中文标题】GENERATED ALWAYS | 的限制是多少?默认情况下 作为 PostgreSQL 中的身份?【英文标题】:What is the limit of GENERATED ALWAYS | BY DEFAULT AS IDENTITY in PostgreSQL?GENERATED ALWAYS | 的限制是多少?默认情况下 作为 PostgreSQL 中的身份? 【发布时间】:2021-12-15 13:30:00 【问题描述】:

PostgreSQL中有smallserialserialbigserial数值数据类型,它们分别有32767、2147483647和9223372036854775807的明显限制。

但是GENERATED ALWAYS | BY DEFAULT AS IDENTITY呢,有什么限制吗?或者它们是根据提供的数据类型(SMALLINTINTBIGINT)计算的?

【问题讨论】:

"或者它们可能是根据提供的数据类型计算的" - 是的。并且“串行”类型的工作方式完全相同(它们不是真正的数据类型) 【参考方案1】:

是的,它取决于列的数据类型,并且可以使用 COLUMNS 元数据进行验证:

CREATE TABLE t1(id SMALLINT GENERATED ALWAYS AS IDENTITY);
CREATE TABLE t2(id INT GENERATED ALWAYS AS IDENTITY);
CREATE TABLE t3(id BIGINT GENERATED ALWAYS AS IDENTITY);

SELECT table_name, column_name, data_type,
       is_identity, identity_minimum, identity_maximum, *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN('t1','t2','t3');

db<>fiddle demo

输出:

【讨论】:

【参考方案2】:

PostgreSQL 中有 smallserial、serial 和 bigserial 数值数据类型,...

这些并不是真正的数据类型。 The manual:

数据类型smallserialserialbigserial不正确 类型,但仅仅是为了创建独特的符号方便 标识符列

实际使用的数据类型分别为smallintintbigint

见:

How to convert primary key from integer to serial? Safely rename tables using serial primary key columns

所有serial 类型都从拥有的SEQUENCE 中抽取数字,该SEQUENCE 基于bigint。 The manual:

序列基于bigint算术,所以范围不能超过 八字节整数的范围(-92233720368547758089223372036854775807)。

IDENTITY 列执行相同的操作,只有 SEQUENCE专门绑定到所属列,这避免了串行“类型”表现出的一些奇怪现象。

见:

Auto increment table column

【讨论】:

以上是关于GENERATED ALWAYS | 的限制是多少?默认情况下 作为 PostgreSQL 中的身份?的主要内容,如果未能解决你的问题,请参考以下文章

在 Dbeaver 上创建 Postgres 表时不能使用“GENERATED ALWAYS AS IDENTITY”?

Datastage装载数据报错 -798 428C9 不能把一个值插入到用GENERATED ALWAYS定义的ROWID列

在 SQL Server Always ON 配置中 - 将事务日志备份到 Nul 会中断 Always On 配置吗?

SQLServer 2012 Always on配置全过程

Always On高可用性集群与AD对接时报错1194

Verilog学习笔记基本语法篇········ 结构说明语句