我们可以在 PSQL 中的 INTEGER 列上创建 ENUM 吗?

Can we create ENUM on INTEGER column in PSQL?

我正在使用 PSQL,我正在尝试创建一个包含列 REQ_TYPE 和 RESP_STATUS 的 table。我决定使用 ENUM 来避免 table 中的无效条目。

我已经使用此查询成功地为 REQ_TYPE 创建了 ENUM。

CREATE TYPE RequestType AS ENUM('GET','POST','PUT','DELETE','PATCH');

但是对于 RESP_STATUS,当我尝试下面的查询时,

CREATE TYPE ResponseStatus AS ENUM(200,201,202,204,301,302,304,400,401,403,404,405,413,415,429,500);

我收到了回复

ERROR: syntax error at or near "200"

我确定

CREATE TYPE ResponseStatus AS ENUM('200','201','202');

会解决我的问题。但我只想将 RESP_STATUS 保留为 INTEGER。

我可以在 INTEGER 上创建 ENUM 吗?如果是,如何?

不,您不能在一组整数上创建 ENUM。来自 reading the fine manual

Enum types take a list of one or more quoted labels

我不明白为什么您需要整数 ENUM。直接在 CHECK 约束中使用整数,或者使用外键引用 table 有效整数。

对于 HTTP 状态代码,这似乎是您的目标,对 table HTTP 状态代码 及其含义 的外键引用很有意义.

枚举是一组任意标签,只等于它们自己;它们不是对特定类型值的约束。将类型定义中的字符串视为比实际值更像列名或编程语言常量。

您可能正在寻找一个域(请参阅 documentation for CREATE DOMAIN),这将允许您有效地 "sub-type" 具有允许值列表的整数:

CREATE DOMAIN http_status AS integer 
CHECK (
    VALUE IN 
    (200,201,202,204,301,302,304,400,401,403,404,405,413,415,429,500)
)

但是,如 中所建议的,使用具有指向已知 HTTP 状态代码列表的外键约束的普通整数列可能更合适,因为这允许:

  • 有关要存储的 HTTP 状态的详细信息(例如 descriptionis_erroris_redirect
  • 更容易添加新的 HTTP 状态(例如,您的示例中缺少 410 GONE417 Expectation Failed