2017-04-25 62 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将它们视为相同。这里的区别可能会让人困惑。 –