簡體   English   中英

兩列的唯一約束

[英]Unique constraint on two columns

我有一個名為QuestionMultipleChoice的表,該表具有以下結構:

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

我想建立一個由QIDCorrectAnswer組成的唯一約束。 但是,我只想限制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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM