2012-08-10 16 views
10

我們有一個包含數百個表的數據庫。使用foreign_keys的表使用INNODB。MySQL發現無效的外鍵

有時我們在開發,階段和生產數據庫之間傳輸數據(使用mysqldump的單個表)。 mysqldump禁用所有外鍵檢查以使導入數據變得容易。

因此,隨着時間的推移,我們的一些非生產型數據庫最終會出現一些孤兒記錄。

我正要寫一個腳本來查找和檢測整個MySQL數據庫的任何無效(指向缺少記錄的鍵)外鍵。

我知道我可以編寫一個查詢來逐個檢查每個表和fkey,但是認爲可能有一個工具可以做到這一點。

我會在寫這樣一個腳本之前檢查一下,看看是否已經有一個。

搜索谷歌有點...令人驚訝的是我什麼也沒找到。

+0

你是什麼意思,'無效'?孤兒記錄?帶有FK的表指向不再存在的表? – 2012-08-10 18:14:21

+0

您可以讓您的數據庫自動執行此操作(取決於您正在使用的數據庫引擎)並將其設置爲ON DELETE CASCADE,以保持參照完整性。 – 2012-08-10 18:18:40

+0

除了stefans評論,請注意,您可以取消或更新兒童,您不必刪除它。 – TomDunning 2012-08-10 18:21:01

回答

12

如果數據已經在和你沒有設置FK約束或級聯刪除父,那麼你只是想:

SELECT * FROM children WHERE my_fk_id NOT IN (select id from parents); 
+1

'SELECT t1。* FROM table1 t1 LEFT JOIN table2 t2 ON t1.parent_id = t2.id WHERE t2.id IS NULL' – DavidS 2012-08-10 18:23:10

+0

@Isotope數據已存在,但我們已經有了fk約束。 – 2012-08-10 18:48:08

+0

這非常適合在桌子上查找無效鍵。但是,我正在尋找一種工具來查找整個數據庫中所有表的這些工具。 – 2012-08-10 19:00:02