Mysql
發現違反對稱約束
假設我有一個
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。