两列的唯一约束

时间:2014-09-20 22:39:00

标签: sql tsql

我有一个名为QuestionMultipleChoice的表,它具有以下结构:

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

我想要建立一个由QIDCorrectAnswer组成的唯一约束。但是,我只想限制CorrectAnswer为'1'的位置。

CONSTRAINT QuestionMultipleChoice_UC UNIQUE (QuestionID, CorrectAnswer)

2 个答案:

答案 0 :(得分:1)

如果您将CorrectAnswer设置为null而不是0,那么(QID,CorrectAnswer)上的唯一索引只会考虑CorrectAnswer为1的行。

从SQL-92标准

  

"当且仅当a中没有两行时,才满足唯一约束   表在唯一列中具有相同的非空值。在   另外,如果使用PRIMARY KEY定义了唯一约束,那么   它要求指定的列或列中没有任何值   是空值。"

答案 1 :(得分:0)

您可以使用Function Based Check ConstraintTrigger

执行此操作

这样的事情(我可能错过了语法):

返回问题的正确答案数的函数:

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);