問題是下面的,唯一約束在兩個字段和他們的反向
我有一個友誼表在我的數據庫中,友誼表有兩個外鍵的用戶表。
我想在兩個外鍵上設置一個唯一的鍵,這樣我就沒有重複,但我想要更多,我想如果用戶A添加了用戶B,那麼B將無法添加A,我想在表中只有一行表示A和B之間的友誼。
有什麼辦法從數據庫服務器添加這樣的約束嗎?
到現在爲止,我在代碼中保留了這個約束。
問題是下面的,唯一約束在兩個字段和他們的反向
我有一個友誼表在我的數據庫中,友誼表有兩個外鍵的用戶表。
我想在兩個外鍵上設置一個唯一的鍵,這樣我就沒有重複,但我想要更多,我想如果用戶A添加了用戶B,那麼B將無法添加A,我想在表中只有一行表示A和B之間的友誼。
有什麼辦法從數據庫服務器添加這樣的約束嗎?
到現在爲止,我在代碼中保留了這個約束。
是的,您需要添加一個觸發器來檢查您描述的業務規則,並在發現衝突時回退事務。這種語法可能會在不同的數據庫中有所不同,但在SQL服務器中它會是
Create Trigger trig_StopRecipFriendships
for Insert, Update On Friendships
As
If Exists (Select * From Friendships F1
Join Friendships F2
On F1.UserA = F2.UserB
And F1.UserB = F2.UserA)
Begin
Rollback Transaction
Raiserror ('These Users are already friends', 16,1)
End
您可以在(LEAST(friend1,friend2), GREATEST(friend1,friend2))
上添加唯一約束。確切的措詞可能取決於使用的RDBMS
。
謝謝你的回答,這正是我需要的:) – mpcabd 2009-09-04 13:54:33