2012-04-08 88 views
1

當我創建一些表格時,真的很簡單,它可能只是我很愚蠢,但我寧願將它發佈在這裏並對它進行排序。在創建表格時檢查約束條件返回錯誤

我正在使用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) 
); 

錯誤:

ERROR: invalid input syntax for type boolean: "closed"

此外,如果任何人都可以給我做的更好的方法檢查:

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

然後,那將非常感激!

回答

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

非常感謝您的幫助。究竟是我在找什麼:) – Jimmy 2012-04-08 16:19:12

+2

@Jimmy - 我可能會分解成2個單獨的約束條件。一個用於「狀態」,另一個用於「優先級」。 – 2012-04-08 16:21:24

2

我覺得兩個約束會更好:增加的粒度就意味着你可以給用戶,即提供更多有意義的反饋他們需要修改Status值或是它的值是Priority是什麼問題?給每個約束一個有意義的名字將有助於這個例如「前端」的編碼器。

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