2015-11-16 4 views
3

У меня есть таблица со столбцами: c1, c2, c3, c4 И я пытаюсь добавить проверку CONSTRAINT условия являются:Postgresql проверочное ограничение условно

  1. если c4 не равно нулю, то c1, c2, c3 все не должны быть нулевыми.
  2. else, если c4 имеет значение null, тогда c1, c2, c3 являются необязательными, но по крайней мере одно поле должно быть не нулевым.

Вот моя команда SQL:

ADD CONSTRAINT quatereulchk CHECK( 
    (c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NOT NULL AND c4 IS NOT NULL) 
    OR 
    (c4 IS NULL AND c1 IS NOT NULL OR c2 IS NOT NULL OR c3 IS NOT NULL) 
    ); 

я тестировал с pg_admin однако Constrain не работает. Благодаря!

+0

Подсказка: проверьте приоритет 'AND' и' OR'. Если бы мы говорили о математике, ваш DDL ожидает, что '2 * 2 + 2' равен' 8' – zerkms

+0

Я вижу, в моем случае это означает, что И выше OR? Спасибо за подсказку! – Lester

+1

Да (и не только в этом случае, но и везде) – zerkms

ответ

3

Попробуйте группировку "c1 IS NOT NULL OR c2 IS NOT NULL OR c3 IS NOT NULL" во втором случае, например:

ADD CONSTRAINT quatereulchk CHECK((c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NOT NULL AND c4 IS NOT NULL) OR (c4 IS NULL AND (c1 IS NOT NULL OR c2 IS NOT NULL OR c3 IS NOT NULL))) 
+0

потрясающий! Это подходит для меня! Спасибо! – Lester

1

Использование coalesce():

ADD CONSTRAINT quatereulchk CHECK( 
    (c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NOT NULL AND c4 IS NOT NULL) 
    OR 
    (c4 IS NULL AND COALESCE(c1, c2, c3) IS NOT NULL) 
    ); 

Некоторые тесты :

insert into example values 
(null, null, null, null); 
ERROR: new row for relation "example" violates check constraint "quatereulchk" 
DETAIL: Failing row contains (null, null, null, null). 

insert into example values 
(null, null, 3, null); 
INSERT 0 1 

insert into example values 
(null, 2, 3, 4); 
ERROR: new row for relation "example" violates check constraint "quatereulchk" 
DETAIL: Failing row contains (null, 2, 3, 4). 

insert into example values 
(1, 2, 3, 4); 
INSERT 0 1 
+0

Спасибо за ваш ответ. Я пытаюсь использовать c1, c2, c3, c4 => (1.1, null, null, null) и его не работает – Lester

+0

Ops, просто опечатка, должна быть 'coalesce (c1, c2, c3)' , Ответ отредактирован. – klin

+0

Теперь это работает для меня; Просто мое любопытство. Между ответом Мануэля Сокедо выше и вашим ответом, какой путь быстрее? – Lester

Смежные вопросы