Constraint
要求 group by 的唯一性
我不確定如何提出這個問題。我有一個包含多個列的表,包括一個 id 列、一個外鍵列“JobId”和一個“GxpId”列。
我有一個要求,一個“JobId”最多可以有一個“GxpId”,但表可以有多個具有相同“JobId”和“GxpId”的行。
有一個單獨的程序將數據導入表中,並且使用該表的應用程序失敗,因為導入程序創建了具有相同“JobId”但不同“GxpId”的兩行。
我想向表中添加一個約束,以確保特定“JobId”的任何行都必須具有相同的“GxpId”。希望這是有道理的。
在 SQL Server 中,您需要一個兩步過程來執行此操作。檢查約束中不能有復雜的邏輯,但它可以引用一個可以的函式。
對於模式的設計方式,此約束是一個非常大的危險信號。查看您的其他問題,您似乎已經意識到這一點並且可以使用的選項有限。
CREATE TABLE TestTable (TestTableId INT IDENTITY(1,1), Jobid INT NOT NULL, GxpId INT NOT NULL) GO CREATE FUNCTION dbo.TestTable_GxpCountForJobId_fn(@JobId AS INT) RETURNS INT BEGIN DECLARE @GxpCount INT SELECT @GxpCount = COUNT(*) FROM ( SELECT DISTINCT GxpId FROM TestTable WHERE JobId = @JobId ) AS DistinctGpx RETURN @GxpCount END GO ALTER TABLE TestTable ADD CONSTRAINT TestTable_SingleRelation_ck CHECK (dbo.TestTable_GxpCountForJobId_fn(JobId) <= 1) GO INSERT INTO TestTable VALUES (1,1) INSERT INTO TestTable VALUES (2,3) INSERT INTO TestTable VALUES (1,1) -- This will fail INSERT INTO TestTable VALUES (1,2)