2016-11-14 50 views
0

我正在使用PSQL,并试图创建一个列REQ_TYPE和RESP_STATUS列的表。而且我已经决定使用ENUM来避免表中的无效条目。我们可以在PSQL的INTEGER列创建ENUM吗?

我已经使用此查询为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吗?如果是,如何?

回答

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状态

  • 细节(例如description,更容易被添加,is_redirect
  • 新的HTTP状态(例如,你错过了从例如410 GONE417 Expectation Failed
1

不,你不能在一组整数上创建一个ENUM。从reading the fine manual

Enum types take a list of one or more quoted labels

我不能完全理解你为什么会想整数的枚举。直接使用整数,可以是CHECK约束,也可以是有效整数表的外键引用。

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

+0

在许多语言中,在一个枚举的条目有一个标签和值;我怀疑这是OP所期待的。例如在C语言中,你可以编写'enum STATUS {OK = 200,NOT_FOUND = 404}'等等。或者,他们正在考虑更接近“域”的东西。然而,我同意你的结论,在这种情况下外键更合适。 – IMSoP

相关问题