【问题标题】:Why does creating a table with a serial column create a sequence with a max val of a bigint?为什么创建具有串行列的表会创建一个最大 val 为 bigint 的序列?
【发布时间】:2017-02-20 19:12:36
【问题描述】:

我对 PostgreSql 有点困惑和新手,我认为 serial = integer 和 bigserial = bigint,所以我很困惑为什么我看到一个最大 val 为 9223372036854775807 而不是 2147483647 的序列,当我创建一个带有PK即串行。

【问题讨论】:

    标签: postgresql postgresql-9.4


    【解决方案1】:

    the PostgreSQL 9.4 docs for Data Type SERIAL 中所述,序列是使用CREATE SEQUENCE tablename_colname_seq 隐式创建的,没有任何附加参数。

    documentation for CREATE SEQUENCE 说:

    可选子句MAXVALUE ma​​xvalue 确定序列的最大值。如果未提供此子句或指定了 NO MAXVALUE,则将使用默认值。升序和降序的默认值分别为 2^63-1 和 -1。

    因此,记录的行为是使用您正在查看的最大值创建序列。

    【讨论】:

    • 虽然最大值是 64 位,但类型仍然是整数。
    • 那么在表上创建顺序键并能够指定最大值的首选方法是什么。我猜只是在相应类型上创建一个 pk 并自己创建序列并设置最大值。
    • 只需使用与使用SERIAL等效的SQL语句并在CREATE SEQUENCE语句的末尾添加MAXVALUE 2147483647即可。如果序列达到最大值,无论如何你都会遇到麻烦。因此,请保持原样,如果所有有效整数都用尽,这最终将导致 integer out of range 错误。
    【解决方案2】:

    序列和列是两个不同的东西。一个序列可以返回一个大于 int4 列可以存储的整数。当您指定SERIALBIGSERIAL 时,PostgreSQL 大致将其转换为:

    1. 创建一个 int4 或 int8 列
    2. 创建序列
    3. 使序列归列拥有
    4. 使列默认值成为序列中的下一个值

    SERIAL 很方便,但没有实际的列类型SERIAL

    【讨论】:

      猜你喜欢
      • 2020-01-18
      • 2016-10-02
      • 1970-01-01
      • 2014-02-15
      • 2015-03-29
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多