【问题标题】:Which data type to use to reference SERIAL data type in PostgreSQL?使用哪种数据类型来引用 PostgreSQL 中的 SERIAL 数据类型?
【发布时间】:2018-06-11 16:49:08
【问题描述】:

我在 PostgreSQL 中有两个表。第一个应该有一个自动递增的 ID 字段,第二个引用:

CREATE TABLE tableA (id SERIAL NOT NULL PRIMARY KEY, ...)
CREATE TABLE tableB (parent INTEGER NOT NULL REFERENCES tableA(id), ...)

根据documentationSERIAL 充当无符号 4 字节整数,而 INTEGER 是有符号的:

serial      4 bytes     autoincrementing integer    1 to 2147483647
integer     4 bytes     typical choice for integer  -2147483648 to +2147483647

如果我理解正确的话,我使用的数据类型不兼容,但PostgreSQL显然lacks unsigned integers。我知道我可能不会使用超过 2*10^9 个 ID(如果我这样做了,我总是可以使用 BIGSERIAL),这并不是那么重要,但对我来说,有符号整数似乎有点不干净引用一个未签名的。我确信一定有更好的方法 - 我错过了什么吗?

【问题讨论】:

  • 有一个处理无符号整数的扩展:github.com/petere/pguint - 它是从您链接的问题中引用的。
  • 是的,我知道,谢谢 - 但是如果 PostgreSQL 支持无符号整数,我会更喜欢它,但它对我来说并不重要。在我的情况下,为此使用扩展似乎有点过头了(我不知道扩展代码的成熟度,它会引入额外的部署约束,可能会导致未来与核心 psql 等的兼容性问题)。

标签: postgresql


【解决方案1】:

A serial 一个整数,它不是“无符号”。自动创建的序列恰好从 1 开始——仅此而已。该列的数据类型仍然是integer(如果您愿意,可以使序列从-2147483648 开始)。

Quote from the manual

CREATE TABLE tablename (
    colname SERIAL
);

等价于

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

(强调我的)

【讨论】:

  • 啊...我现在明白我的错误了。当我看到SERIAL1 开始时,我将最终值误读为 4*10^9,而不是 2*10^9... 但实际上SERIAL 值只是INTEGER 值的子集。现在说得通了,谢谢!
  • @johndodo:不,它不是“子集”。它与integer完全相同。在psql 中使用\d 查看表定义,您将看到
  • 同意,serial 不是 integer 的子集 - 而是序列 values(1 到 2147483647)整数的子集(-2147483648 到 2147483647)。如果我在这里没有使用精确的数学术语,那么很抱歉 - 英语不是我的主要语言。但是我完全理解您在说什么,只是我的错误在其他地方,您的回答帮助我识别了它。所以谢谢!
  • 正如我已经写过的:如果您愿意,串行 (=sequence) 值可以以 -2147483648 开头。
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多