Предотвращение нуля при определенных условиях - PullRequest
2 голосов
/ 01 марта 2012

Можно ли выразить условную проверку для вставки или обновления таблицы (SQL Server 2008 R2), в которой говорится, что столбец A не может быть пустым, если столбец B равен 12,13 или 14.

Ответы [ 3 ]

7 голосов
/ 01 марта 2012

Это можно реализовать с помощью уровня таблицы CHECK ограничение :

ALTER TABLE YourTable 
ADD CONSTRAINT CK_YourCheck 
CHECK(ColumnA IS NOT NULL OR ColumnB NOT IN (12, 13, 14))
1 голос
/ 01 марта 2012

Да, вы можете сделать это, используя Проверить ограничение

Как-то так?

ADD CONSTRAINT check validCHECK ( 
       ((B BETWEEN 12 and 14) AND A IS NOT NULL) 
        OR B NOT BETWEEN 12 and 14 
   );
0 голосов
/ 02 марта 2012

В логике первого порядка это известно как импликация:

IF x THEN y

Применяя закон импликации, вышеприведенное можно преобразовать в следующее:

( NOT ( x ) ) OR y

Подставляя ваши выражения:

IF column B is equal to 12,13 or 14 THEN A cannot be null 

Применение закона импликации:

( NOT ( column B is equal to 12,13 or 14 ) ) OR A cannot be null 

Подстановка выражений SQL:

( NOT ( B IN (12, 13, 14) ) ) OR ( NOT ( A IS NULL ) ) 

Применение законов Де Моргана:

( NOT x ) OR ( NOT y ) is equivlent to NOT ( x AND y )

Следовательно:

NOT ( B IN (12, 13, 14) AND A IS NULL )

SQL DDL:

ALTER TABLE YourTable ADD 
   CONSTRAINT your_rule
      CHECK ( NOT ( B IN (12, 13, 14) AND A IS NULL ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...