簡體   English   中英

如何檢查 MySQL 中關系的完整性?

[英]How do I check the integrity of a relationship in MySQL?

我做這樣的事情:

SET foreign_key_checks = 0;
//many different operations on several tables
SET foreign_key_checks = 1;

如何驗證我的整個基礎是一致的? 我想確保所有關系都得到妥善維護。 例如,如果我刪除一個 id 為 20 的“國家”,我想確保沒有一個“城市”與“country_id”=20 的關系不存在。

如果你不SET foreign_key_checks = 0會更容易。 如果您繼續執行約束,那么您就不能產生不一致或損壞的引用。 如果你嘗試,你會得到一個錯誤。 因此,如果參照完整性很重要,您應該考慮不要關閉 FK 檢查。

如果您確實認為您有不一致的地方,您必須執行如下查詢,以驗證不存在引用不再存在的父級的“孤兒”:

SELECT cities.city_id
FROM cities
LEFT OUTER JOIN countries
 ON cities.country_id = countries.country_id
WHERE countries.country_id IS NULL;

如果 JOIN 條件基於 country_id 的相等性,這意味着 country_id 不能是 NULL。 當沒有匹配時,左外連接為所有列返回 NULL。 因此,如果您在 WHERE 子句中搜索country_id IS NULL的情況,則只會返回在另一個表中不匹配的城市。

您必須對數據庫中的每個關系進行單獨的查詢。 這可能是一件苦差事,如果表非常大,可能需要很長時間。

多年前,我曾經在一個沒有外鍵約束的錯誤應用程序中這樣做(它使用了 MyISAM 表)。 我每天晚上都運行一個腳本來執行所有這些孤兒檢查,最終它增長到幾十個查詢,並且需要幾個小時才能運行。

然后是更難的部分:一旦你找到了一些孤立的記錄,你會怎么處理它們? 你會刪除孤兒嗎? 您是否更改了他們的外鍵列以引用仍然存在的父記錄? 你恢復父記錄嗎? 可以是這些選項中的任何一個,並且您必須讓有知識和權力的人逐案審查孤立記錄,以選擇如何解決問題。

保持強制執行約束要好得多,這樣您就不必做這項工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM