2010-08-09 4 views
18

Я использую SQL Server 2008проверочное ограничение на несколько столбцов

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

Я получаю сообщение об ошибке:

Column CHECK constraint for column 'AAAA' references another column, table 'XXXX'.

проверочное ограничение не работает таким образом.

Любой другой способ реализовать это на одной таблице без использования FK?

Благодаря

Вот пример моего кода

CREATE TABLE dbo.Test 
( 
EffectiveStartDate dateTime2(2)  NOT NULL, 
EffectiveEndDate dateTime2(2)  NOT NULL 
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate), 
); 
+2

Почему «без FK» ?? Внешние ключи ** разработаны ** для связывания двух таблиц - это их основная компетенция, их работа, их причина быть - почему бы не использовать FK, когда это действительно работа FK? –

+0

Я добавил свой код к моему вопросу, надеюсь, теперь есть больше смысла. – GibboK

ответ

40

Да, определить проверочное ограничение на таблице уровня

CREATE TABLE foo (
    bar int NOT NULL, 
    fred varchar(50) NOT NULL, 

    CONSTRAINT CK_foo_stuff CHECK (bar = 1 AND fred ='fish') 
) 

Вы объявляете его рядный как колонки ограничение

... 
fred varchar(50) NOT NULL CONSTRAINT CK_foo_fred CHECK (...) 
... 

Редактировать, проще разместить, чем описать. Исправлены запятые.

CREATE TABLE dbo.Test 
( 
    EffectiveStartDate dateTime2(2)  NOT NULL, 
    EffectiveEndDate dateTime2(2)  NOT NULL, --need comma 
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate) --no comma 
); 

Конечно, остается открытым вопрос вы используете СНЕСК, где оно должно быть ограничение FK ...?

+0

привет, я протестировал ваш код и его работу, я отправил на мой оригинальный вопрос, потому что он очень похож, но не работает. Есть идеи? спасибо за ваше время – GibboK

+0

+1, хотя я бы утвердил, что логически ограничение определено на уровне строки. Ограничение CHECK на уровне таблицы могло бы ссылаться на данные в разных строках в одной и той же таблице, что SQL Server не поддерживает напрямую. – onedaywhen

+0

@onedaywhen: ограничение CK * всегда * для каждой строки. «Уровень таблицы» относится к прикрепленной к таблице, а не к столбцу. – gbn

2

Проверка ограничений может относиться к одному столбцу или ко всей записи.

Используйте этот синтаксис для ограничения на уровне записей:

ALTER TABLE MyTable 
ADD CONSTRAINT MyCheck 
CHECK (...your check expression...) 
1

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