Constraint

要求 group by 的唯一性

  • April 24, 2014

我不確定如何提出這個問題。我有一個包含多個列的表,包括一個 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)

引用自:https://dba.stackexchange.com/questions/63776