2017-04-25 77 views
1

我做了一個約束,將列completed的列標記爲true其他列的某些列必須具有值。基於單列未約束的列的約束

但由於某種原因,當我將completed標記爲true時,當我離開指定的列空白時,約束不會發生抱怨。我也故意插入NULL指定的列,仍然沒有約束。

任何想法?

CREATE TABLE info (
    id bigserial PRIMARY KEY, 
    created_at timestamptz default current_timestamp, 
    posted_by text REFERENCES users ON UPDATE CASCADE ON DELETE CASCADE, 
    title character varying(31), 
    lat numeric, 
    lng numeric, 
    contact_email text, 
    cost money, 
    description text, 
    active boolean DEFAULT false, 
    activated_date date, 
    deactivated_date date, 
    completed boolean DEFAULT false, 
    images jsonb, 

    CONSTRAINT columns_null_check CHECK (
    (completed = true 
    AND posted_by != NULL 
    AND title != NULL 
    AND lat != NULL 
    AND lng != NULL 
    AND contact_email != NULL 
    AND cost != NULL 
    AND description != NULL 
    AND images != NULL) OR completed = false) 
); 
+4

嘗試使用測試'IS NOT NULL'但不是'= NULL'! –

回答

2

Chapter 9. Functions and Operators

要檢查值是否爲或不爲空,則使用謂詞:

expression IS NULL 
expression IS NOT NULL 

或相當,但非標準,謂詞:

expression ISNULL 
expression NOTNULL 

因此,您不能使用value != NULL來檢查空值,您只能使用value IS NULLvalue IS NOT NULL

對於布爾值,它們是相同的:

布爾值,也可以使用的謂詞

boolean_expression IS TRUE 
boolean_expression IS NOT TRUE 
boolean_expression IS FALSE 
boolean_expression IS NOT FALSE 
boolean_expression IS UNKNOWN 
boolean_expression IS NOT UNKNOWN 
+0

我會裁剪'未知'和'未知'的例子。雖然規格不同,但PostgreSQL將它們視爲相同。這裏的區別可能會讓人困惑。 –