Mysql

發現違反對稱約束

  • January 16, 2015

假設我有一個Friends包含列的表Friend1ID, Friend2ID。我選擇用兩條記錄來表示每段友誼,比如 (John, Jeff) 和 (Jeff, John)。因此,每對朋友應該恰好在表中出現兩次。

有時,這個約束被違反了,即一對朋友在表中只出現一次。如何編寫一個查詢來辨識所有此類情況(理想情況下,使用合理的標準 SQL)?換句話說,我希望查詢返回此表中的行列表,其中沒有對應的行與交換欄位。

另一個問題:有沒有辦法在 MySQL 中強制執行這種引用完整性?

要查找行,請使用左外連接:

select 
   a.Friend1ID, a.Friend2ID, b.Friend1ID, b.Friend2ID 
from
   Friends a left join Friends b 
       on (a.Friend1ID=b.Friend2ID and a.Friend2ID=b.Friend1ID)
where 
   b.friend1ID IS NULL ;

最簡單的方法是將每個關係僅儲存一次,並通過檢查約束 Friend1 強制執行該關係

CREATE VIEW AllFriendships
AS
SELECT Friend1, Friend2 FROM Friendships
UNION ALL
SELECT Friend1 AS Friend2, Friend2 AS Friend1 FROM Friendships

但是,如果您確實需要同時包含 Friend1,Friend2 和 Friend2,Friend1 的表,如果 MySql 的約束實現更完整,您可以創建一個自引用外鍵:

FOREIGN KEY(Friend1,Friend2) REFERENCES Friendships(Friend2,Friend1)

創建此約束後,您將只能在一個語句中插入兩行。不幸的是,這不適用於 MySql。

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