2013-05-27 79 views
0

找不到任何答案,所以我正在寫這個未解決的問題。我很好奇,如果有可能在SQL Server 2008表的2列創建這樣的UNIQUE約束,那麼「正常」和「反向」重複將不被允許。2列的唯一約束,但正常和相反的順序

實施例:

ID1 = 10, ID2 = 20 -- existing row 

試圖增加一對值:

ID1 = 10, ID2 = 20 -- not allowed because of the UNIQUE key 
ID1 = 20, ID2 = 10 -- allowed 

第二行將被插入(當然這不是一個重複)。這就是問題所在。是否可以在表上設置任何鍵/約束/無論如何禁止上面的插入?即使用表達式而不是列列表的東西?現在我使用觸發器來檢查這種「重複」,但我只是想知道是否有更簡單的解決方案。

謝謝, 彼得P.

回答

0
CREATE TABLE dbo.test 
    (ID1 int , ID2 int , 
    CONSTRAINT ID_UK UNIQUE(ID1,ID2), 

    ) 

    GO 


    IF EXISTS (SELECT name FROM sysobjects 
    WHERE name = 'check_val' AND type = 'TR') 
    DROP TRIGGER check_val 
    GO 
    CREATE TRIGGER check_val 
    ON dbo.test 
    FOR INSERT, UPDATE 
    AS 
    if exists (select i.ID1 ,i.ID2 from inserted i inner join dbo.test t 
    on t.ID2=i.ID1 and t.ID1=i.ID2) 

    RAISERROR ('duplicate values', 
    16, 1) 
    ROLLBACK TRANSACTION 

    GO 

    insert dbo.test 
    select 10,20 
    union 
    select 20,10 
+0

@Peter:此代碼將不會允許您的要求重複插入,你可以調整交易,在觸發按您的要求 – Nishad

+0

這就是我所做的。只是認爲有一個更簡單的解決方案,而不必觸發一個觸發器:) – peterp

+0

我沒有正確看待這個問題,跳到解決方案:)請忽略 – Nishad