PostgreSQL有三种数字数据类型:smallserial
、serial
和bigserial
,分别具有明显的限制,分别为32767、2147483647和9223372036854775807。
但是对于GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
,它是否有任何限制呢?或者它们是根据提供的数据类型(SMALLINT
、INT
、BIGINT
)进行计算的?
PostgreSQL有三种数字数据类型:smallserial
、serial
和bigserial
,分别具有明显的限制,分别为32767、2147483647和9223372036854775807。
但是对于GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
,它是否有任何限制呢?或者它们是根据提供的数据类型(SMALLINT
、INT
、BIGINT
)进行计算的?
是的,它取决于列的数据类型,并且可以使用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');
输出:
SEQUENCE
的数字中获取,它基于bigint
。 手册:
序列基于bigint
算术,因此范围不能超过八字节整数的范围(-9223372036854775808
到9223372036854775807
)。
IDENTITY
列也是如此,只不过SEQUENCE
专门绑定到拥有的列,这避免了一些序列“类型”所表现出的怪异行为。