在 PostgreSQL 中,GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY 的限制是什么?

5

PostgreSQL有三种数字数据类型:smallserialserialbigserial,分别具有明显的限制,分别为32767、2147483647和9223372036854775807。

但是对于GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY,它是否有任何限制呢?或者它们是根据提供的数据类型(SMALLINTINTBIGINT)进行计算的?


2
“或者它们是根据提供的数据类型计算出来的” - 是的。而“串行”类型的工作方式完全相同(它们本来就不是真正的数据类型)。 - user330315
2个回答

4

是的,它取决于列的数据类型,并且可以使用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演示

输出:

在此输入图像描述


3
在PostgreSQL中有smallserial、serial和bigserial数值数据类型,...但它们实际上不是真正的数据类型。手册。这些数据类型只是用于创建唯一标识符列的便利表示法。实际使用的数据类型分别是smallint、int和bigint。请参阅:如何将主键从整数转换为序列? 使用序列主键列安全地重命名表
所有的序列类型都从一个拥有SEQUENCE的数字中获取,它基于bigint手册: 序列基于bigint算术,因此范围不能超过八字节整数的范围(-92233720368547758089223372036854775807)。 IDENTITY列也是如此,只不过SEQUENCE专门绑定到拥有的列,这避免了一些序列“类型”所表现出的怪异行为。
请参阅:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接