[英]Unique constraint on two columns
我有一個名為QuestionMultipleChoice
的表,該表具有以下結構:
ID int,
QID int,
Text varchar(200),
CorrectAnswer bit
我想建立一個由QID
和CorrectAnswer
組成的唯一約束。 但是,我只想限制CorrectAnswer
為“ 1”的位置。
CONSTRAINT QuestionMultipleChoice_UC UNIQUE (QuestionID, CorrectAnswer)
如果將CorrectAnswer
設置為null而不是0,則(QID,CorrectAnswer)
上的唯一索引將僅考慮CorrectAnswer
為1的行。
從SQL-92標准
“當且僅當表中的兩行在唯一列中沒有相同的非空值時,才滿足唯一約束。此外,如果唯一約束是使用PRIMARY KEY定義的,則它不需要指定的一個或多個列為空值。”
像這樣的東西(我可能在語法上有所遺漏):
該函數返回問題的正確答案的數量:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.