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中有smallserial
、serial
和bigserial
数值数据类型,它们分别有32767、2147483647和9223372036854775807的明显限制。
但是GENERATED ALWAYS | BY DEFAULT AS IDENTITY
呢,有什么限制吗?或者它们是根据提供的数据类型(SMALLINT
、INT
、BIGINT
)计算的?
【问题讨论】:
"或者它们可能是根据提供的数据类型计算的" - 是的。并且“串行”类型的工作方式完全相同(它们不是真正的数据类型) 【参考方案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:
数据类型
smallserial
、serial
和bigserial
不正确 类型,但仅仅是为了创建独特的符号方便 标识符列
实际使用的数据类型分别为smallint
、int
和bigint
。
见:
How to convert primary key from integer to serial? Safely rename tables using serial primary key columns所有serial
类型都从拥有的SEQUENCE
中抽取数字,该SEQUENCE
基于bigint
。 The manual:
序列基于
bigint
算术,所以范围不能超过 八字节整数的范围(-9223372036854775808
到9223372036854775807
)。
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 配置吗?