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

时间:2016-11-14 10:12:28

标签: database-design enums psql

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

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

  

创建类型RequestType AS ENUM(' GET',' POST',' PUT',' DELETE'' PATCH& #39);

但对于RESP_STATUS,当我尝试以下查询时,

  

创建类型ResponseStatus AS ENUM(200,201,202,204,301,302,304,400,401,403,404,405,413,415,429,500);

我收到了回复

  

错误:语法错误等于或接近" 200"

我确定

  

创建类型ResponseStatus AS ENUM(' 200',' 201',' 202');

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

我可以在INTEGER上创建ENUM吗?如果是,怎么样?

2 个答案:

答案 0 :(得分:1)

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

  

枚举类型采用一个或多个带引号的标签列表

我无法理解为什么你想要一个整数的ENUM。直接在CHECK约束中使用整数,或者使用对有效整数表的外键引用。

对于HTTP状态代码(似乎是您的目标),对HTTP状态代码及其含义的表的外键引用非常有意义。

答案 1 :(得分:1)

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

您可能正在寻找一个域名(请参阅documentation for CREATE DOMAIN),这样您就可以有效地"子类型"带有允许值列表的整数:

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)
)

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

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