创建表时检查约束返回错误

时间:2012-04-08 15:55:05

标签: sql postgresql create-table

当我创建一些表时非常简单的错误,这可能只是我愚蠢但我宁愿在这里发布并将其排序。

我正在使用Postgresql。

(这张桌子只是其中之一,但却是给我一个问题的那张桌子)

CREATE TABLE Ticket
(
    ID      INTEGER NOT NULL PRIMARY KEY,
    Problem VARCHAR(1000),
    Status  VARCHAR(20) NOT NULL DEFAULT 'open', 
    Priority    INTEGER NOT NULL,
    LoggedTime  TIMESTAMP NOT NULL,
    CustomerID  INTEGER NOT NULL,
    ProductID   INTEGER NOT NULL,
    FOREIGN KEY (ProductID) REFERENCES Product(ID),
    FOREIGN KEY (CustomerID) REFERENCES Customer(ID),
    CHECK (status='open' OR 'closed' AND priority =  1 OR 2 OR 3)
);

错误:

  

错误:类型为boolean的输入语法无效:“closed”

另外,如果有人能给我一个更好的方法来做CHECK:

CHECK (status='open' OR 'closed' AND priority =  1 OR 2 OR 3)

然后真的很感激!

2 个答案:

答案 0 :(得分:3)

使用

CHECK (Status IN ('open','closed') AND Priority IN (1,2,3))

您也可以使用

(Status ='open' OR  Status ='closed') AND
      (Priority =  1 OR Priority =  2 OR Priority =  3)

答案 1 :(得分:2)

我认为两个约束条件会更好:增加粒度意味着您可以向用户提供更有意义的反馈,即他们是否需要修改Status值,或者是Priority值是问题?赋予每个约束一个有意义的名称将有助于“前端”编码器在此例如

...
CONSTRAINT ticket_status__invalid_value
    CHECK ( Status IN ( 'open' , 'closed' ) ), 
CONSTRAINT ticket_priority__invalid_value 
    CHECK ( Priority IN ( 1 , 2 , 3 ) ), 
...