2014-09-20 5 views
1

У меня есть таблица под названием QuestionMultipleChoice, который имеет следующую структуру:Уникального ограничения на две колонках

ID int, 
QID int, 
Text varchar(200), 
CorrectAnswer bit 

Я желающий установить ограничение уникальности, которое состоит из QID и CorrectAnswer. Тем не менее, я только хочу ограничить, где CorrectAnswer - '1'.

CONSTRAINT QuestionMultipleChoice_UC UNIQUE (QuestionID, CorrectAnswer) 

ответ

0

Вы можете сделать это с помощью Function Based Check Constraint или Trigger.

Что-то вроде этого (я, возможно, пропустили на синтаксисе):

Функция, которая возвращает количество правильных ответов на вопрос:

CREATE FUNCTION CheckAnswer(pQuestionId int) 
RETURNS int 
AS 
BEGIN 
    DECLARE @retval int 
    SELECT @retval = COUNT(*) FROM QuestionMultipleChoice c where c.QuestionId = pQuestionId and c.CorrectAnswer = 1 
    RETURN @retval 
END; 

ограничение, которое использует эту функцию для проверки у этого вопроса есть только один правильный ответ. Проверка на CorrectAnswer = 0 для небольшой оптимизации:

ALTER TABLE QuestionMultipleChoice 
ADD CONSTRAINT chkAnswer CHECK (CorrectAnswer = 0 OR dbo.CheckAnswer(QuestionId) <= 1); 
1

Если вы установите CorrectAnswer нулевое значение вместо 0, то уникальный индекс на (QID,CorrectAnswer) будет рассматривать только те строки, в которых CorrectAnswer является 1.

Из SQL -92 стандарт

«уникальное ограничение выполняется, если и только если никакие две строки в таблице не имеют те же ненулевые значения в уникальных столбцов. В , если уникальное ограничение было определено с помощью PRIMARY KEY, то требует, чтобы ни одно из значений в указанном столбце или столбцах не было нулевым значением. "

+0

Неужели мне еще нужно создать «УНИКАЛЬНЫЙ НЕПРЕРЫВНЫЙ ИНДЕКС»? Другие сайты, похоже, говорят, что уникальное ограничение будет по-прежнему взорваться множеством нулевых значений. –

+0

@JustinAdkins, если индекс уникален, не имеет значения, не индексирован или не кластеризуется индекс. попробуйте – FuzzyTree

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