2017-04-25 1 views
1

Ich machte eine Nebenbedingung, wo die Spalte completed bis true markieren einige der anderen Spalten müsste einen Wert haben.Einschränkung auf Spalten basierend auf einzelnen Spalte nicht feuern

Aber aus irgendeinem Grund beschwert sich die Einschränkung nicht, wenn ich eine angegebene Spalte leer lasse, wenn completed mit true markiert ist. Ich habe auch absichtlich NULL eine angegebene Spalte eingefügt und immer noch keine Einschränkung.

Irgendwelche Ideen?

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

Ausprobieren Verwenden die Prädikate mit getestet werden können 'NULL' NICHT aber nicht' = NULL'!. –

Antwort

2

In Chapter 9. Functions and Operators:

Um zu überprüfen, ob ein Wert ist oder nicht null ist, verwenden Sie die Prädikate:

expression IS NULL 
expression IS NOT NULL 

oder das Äquivalent, aber nicht dem Standard entsprechenden Prädikate:

expression ISNULL 
expression NOTNULL 

Daher können Sie value != NULL nicht verwenden, um Nullwerte zu überprüfen. Sie können nur value IS NULL und value IS NOT NULL verwenden.

Für Boolesche Werte, die sie sind die gleichen:

Boolesche Werte auch

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

Ich würde das 'unbekannte' und' nicht unbekannte' Beispiel herausschneiden. Während anders in der Spezifikation behandelt PostgreSQL sie gleich. Die Unterscheidung ist möglicherweise verwirrend. –

Verwandte Themen