我有一个名为QuestionMultipleChoice
的表,它具有以下结构:
ID int,
QID int,
Text varchar(200),
CorrectAnswer bit
我想要建立一个由QID
和CorrectAnswer
组成的唯一约束。但是,我只想限制CorrectAnswer
为'1'的位置。
CONSTRAINT QuestionMultipleChoice_UC UNIQUE (QuestionID, CorrectAnswer)
答案 0 :(得分:1)
如果您将CorrectAnswer
设置为null而不是0,那么(QID,CorrectAnswer)
上的唯一索引只会考虑CorrectAnswer
为1的行。
从SQL-92标准
"当且仅当a中没有两行时,才满足唯一约束 表在唯一列中具有相同的非空值。在 另外,如果使用PRIMARY KEY定义了唯一约束,那么 它要求指定的列或列中没有任何值 是空值。"
答案 1 :(得分: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);