【发布时间】:2017-02-20 19:12:36
【问题描述】:
我对 PostgreSql 有点困惑和新手,我认为 serial = integer 和 bigserial = bigint,所以我很困惑为什么我看到一个最大 val 为 9223372036854775807 而不是 2147483647 的序列,当我创建一个带有PK即串行。
【问题讨论】:
我对 PostgreSql 有点困惑和新手,我认为 serial = integer 和 bigserial = bigint,所以我很困惑为什么我看到一个最大 val 为 9223372036854775807 而不是 2147483647 的序列,当我创建一个带有PK即串行。
【问题讨论】:
如the PostgreSQL 9.4 docs for Data Type SERIAL 中所述,序列是使用CREATE SEQUENCE tablename_colname_seq 隐式创建的,没有任何附加参数。
documentation for CREATE SEQUENCE 说:
可选子句MAXVALUE maxvalue 确定序列的最大值。如果未提供此子句或指定了 NO MAXVALUE,则将使用默认值。升序和降序的默认值分别为 2^63-1 和 -1。
因此,记录的行为是使用您正在查看的最大值创建序列。
【讨论】:
CREATE SEQUENCE语句的末尾添加MAXVALUE 2147483647即可。如果序列达到最大值,无论如何你都会遇到麻烦。因此,请保持原样,如果所有有效整数都用尽,这最终将导致 integer out of range 错误。
序列和列是两个不同的东西。一个序列可以返回一个大于 int4 列可以存储的整数。当您指定SERIAL 或BIGSERIAL 时,PostgreSQL 大致将其转换为:
SERIAL 很方便,但没有实际的列类型SERIAL。
【讨论】: