2013-12-02 6 views
1

Я хочу ограничить столбец, что он может иметь только значение, когда другой столбец имеет значение.Ограничение проверки SQL на столбец, ссылающееся на другие столбцы

пример: (это не работает)

create table testConstraint (
col1 int not null identity(1, 1) primary key, 
col2 int, 
col3 int check (col2 is not null), 
col4 int) 

Это невозможно, потому что он не может ссылаться на другую колонку. Ошибка:

Column CHECK constraint for column 'col3' references another column, table 'testConstraint'.

Другая попытка была: (также не работает)

create table testConstraint (
col1 int not null identity(1, 1) primary key, 
col2 int, 
col3 int, 
col4 int) 
GO 

alter table testConstraint add constraint ck_columnNotNull check (case when col2 is null then col3 is null end) 
GO 

Кто-нибудь есть идеи, как это было бы возможно с ограничением?

ответ

2

Вы можете написать триггер.

Кроме того, вы можете попробовать это

(1)

ALTER TABLE TestConstraint ADD CONSTRAINT 
    CK_TestConstraint CHECK (NOT ((col3 is not null) and (col2 is null))) 
GO 

или это

(2)

ALTER TABLE TestConstraint ADD CONSTRAINT 
CK_TestConstraint CHECK 
(
    ((col3 is not null) and (col2 is not null)) or 
    ((col3 is null) and (col2 is null)) 
) 
GO 

в зависимости от того, что именно вам нужно.

Я только что протестировал его, и он работает нормально, я думаю.

insert into 
TestConstraint 
(col2, col3, col4) 
values 
(null, 1, 2) 

-- ERROR 

insert into 
TestConstraint 
(col2, col3, col4) 
values 
(1, 1, 2) 

-- OK 
+0

для разработки: col2 - это внешний ключ, который позволяет использовать NULL. Но col3 может иметь значение только в том случае, если col2 имеет значение. Я знаю, что это возможно с помощью триггера, но я надеялся, что это будет возможно с ограничением. Я считаю, что триггеры более опасны, чем ограничения. –

0
ALTER TABLE testConstraint 
ADD CONSTRAINT ck_columnNotNull 
CHECK (1 = CASE 
       WHEN col2 IS NULL AND col3 IS NULL THEN 1 
       WHEN col2 IS NOT NULL AND col3 IS NOT NULL THEN 1 
      ELSE 0 
     END) 
+0

Я думаю, что он хочет сделать ошибку, только когда «col3 не является нулевым», но «col2 равно null». Ваше выражение делает что-то другое. Кроме того, это может быть упрощено - см. (2) в моем ответе. –

+0

@ peter.petrov: Возможно, вы правы, Том может поставить любое условие в предложение WHEN. –

0

только простая логика не требуется, плюс он должен (в соответствии с вашей второй попытки), чтобы быть проверочное ограничение таблицы, поэтому вы не можете объявить его рядный с объявлением col3:

create table testConstraint (
col1 int not null identity(1, 1) primary key, 
col2 int, 
col3 int, 
col4 int) 
GO 

alter table testConstraint add constraint ck_columnNotNull check (
    col3 is null 
or col2 is not null 
) 
GO 

Если col3 является null, то мы не уход что значение col2 есть. И наоборот, если это неNULL, то мы хотим обеспечить соблюдение col2не null. Это то, что обе стороны or фактически дают нам.

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