MySQL Cannot Add Foreign Key Constraint 錯誤如何修復?

已發表: 2022-12-22

如何修復“ MySQL 無法添加外鍵約束”錯誤? 嘗試向 MySQL 表添加外鍵約束時,您可能會收到以下錯誤消息:“ ERROR 1215 (HY000): Cannot add foreign key constraint ”。

像這樣的錯誤非常普遍,並沒有提供有關 MySQL 無法將外鍵約束插入表的具體原因的具體細節。 要解決此問題,您需要確定問題的確切原因。

本文將通過四種行之有效的方法解釋MySQL出現“#1215 – Cannot Add Foreign Key Constraint”錯誤的原因,如何查找原因,以及如何修復。

MySQL Cannot Add Foreign Key Constraint 錯誤如何修復?

MySQL報“#1215 – Cannot Add Foreign Key Constraint”錯誤是什麼原因?

此錯誤可能有多種原因。 為了確定此錯誤的原因,最好檢查 SHOW ENGINE INNODB STATUS 的 LATEST FOREIGN KEY ERROR 部分。

這樣,您將對問題有更好的理解。 您將能夠從以下列表中識別您的案例:

通常,在加載轉儲時,約束所指的表或索引不存在

有時,客戶希望添加約束的數據庫表不存在,導致出現 1215 錯誤信息。

但是,沒有跡象表明該表不存在,因此建議您使用該命令來確定數據庫中有哪些表可用。

在每個父表上運行 SHOW TABLES 或 SHOW CREATE TABLE。 任何返回錯誤 1146 的表都表示這些表的創建順序不正確。

解決方案是運行缺少的 CREATE TABLE 並重試或暫時禁用外鍵檢查。 在可能存在循環引用的備份恢復期間執行此步驟是必不可少的。

運行以下代碼來修復錯誤:

 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS; SET FOREIGN_KEY_CHECKS=0; SOURCE /backups/mydump.sql; -- restore your backup within THIS session SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

約束引用中的表或索引濫用引號

如果您希望診斷此錯誤,請檢查每個 FOREIGN KEY 聲明並確保對象限定符周圍沒有引號,或者表格周圍有引號並且每個列名稱周圍有一對。

這可以通過不引用任何內容或分別引用表和列來解決。

約束引用中的本地鍵、外部表或列有拼寫錯誤

可以通過運行 SHOW TABLES 和 SHOW COLUMNS 並將字符串與 REFERENCES 聲明中指定的字符串進行比較來診斷此錯誤。 錯別字一經發現應及時更正。

約束引用的列與外部列的類型或寬度不同

對於診斷,使用 SHOW CREATE TABLE parent 來確保本地列和引用列包含相同類型的數據和寬度。

可以通過編輯 DDL 語句來解決該問題,以確保子表中的列定義與父表中的列定義相匹配。

異物不是任何類型的 KEY

要診斷此問題,請使用 SHOW CREATE TABLE parent 檢查表的 REFERENCES 部分以確保指向它的列未被索引。

通過使該列成為 KEY、UNIQUE KEY 或 PRIMARY KEY 來解決問題。

外鍵是多列PK或UK,其中引用的列不是最左邊的

為了診斷此錯誤,執行 SHOW CREATE TABLE parent 命令以確定 REFERENCES 部分是否指向某個列,該列存在於某些多列索引中但不是其定義中的最左邊。

您可以通過向父表添加索引來解決此問題,其中引用的列是最左邊或唯一的列。

兩個表/列之間的不同字符集/排序規則

要診斷問題,請運行 SHOW CREATE TABLE parent 並驗證子列的 CHARACTER SET 和 COLLATE 部分是否與父表上的部分匹配。

要解決此問題,請確保子表 DDL 與其父表/列的字符集和排序規則相匹配,或者更改父表以使其定義與子表的定義相匹配。

父表沒有使用 InnoDB

可以通過運行 SHOW CREATE TABLE parent 並檢查 ENGINE=INNODB 來診斷該問題。

更改父表以從 MySQL 切換到 InnoDB 以解決此問題。

如何查找“無法添加外鍵約束”錯誤的原因?

這個錯誤並沒有說明MySQL無法對錶進行外鍵約束的具體原因,很籠統。

為幫助解決此問題,您需要確定確切原因。 您可以通過在 MySQL 客戶端中運行以下查詢來執行此操作:

 SHOW ENGINE INNODB STATUS;

此查詢將返回三個字段:類型、名稱和狀態。 LATEST FOREIGN KEY ERROR 可以通過展開結果的狀態列來識別。

本節旨在確定上次更改查詢失敗的原因,以便您可以解決問題。

導致此問題的原因通常是主表和外部表中的列類型不匹配。

問題也可能是兩個表的引擎類型不匹配引起的,例如 MyISAM 和 InnoDB。

這也可能是由於表之間的排序規則不同,一個使用 UTF-8,另一個使用 latin1。

您應該注意以下因素:

Engine :每張表應該配置相同的數據庫引擎,例如InnoDB。

數據類型:在一個表中,兩列應具有相同的“ datatype. int(11) datatype. int(11) ”,而在另一個例子中, smallint(5)會導致問題。

Collat​​ion :為了確保兼容性,兩個列的字符集應該相同,例如,UTF8。

注意:列仍然可以有不同的列,即使您的表具有相同的排序規則。

Unique :外鍵應該引用引用表中的唯一字段,通常是主字段。

Ungisned :一個表可能有未簽名的鍵,而另一個表可能沒有任何未簽名的鍵。

如何修復MySQL“#1215 – Cannot Add Foreign Key Constraint”錯誤(4種方法)?

討論了導致此錯誤消息的不同原因後,我們進入了下一步。 這個錯誤需要修復,讓我們看看如何用四種有效的方法來修復它。

方法 1:檢查表可用性

要開始排查錯誤,您可以通過運行以下命令檢查該表是否存在:

 show tables;

從這段代碼中可以明顯看出,由於表可用,因此可以創建約束。

方法 2:確保父表正在使用 InnoDB

可以通過檢查數據庫表的存儲引擎集來進一步調查。 可以使用以下命令來執行此操作:

 SHOW CREATE TABLE parent

結果是你會發現 InnoDB 不是存儲引擎。 由於設置了 ENGINE=MYISAM,您可以通過運行以下命令來更改存儲引擎:

 ALTER TABLE parent ENGINE=INNODB;

最終可以使用此方法修復錯誤。

方法三:檢查是否有不當引用

對於每個 FOREIGN KEY 聲明,請確保沒有在對象限定符周圍插入引號,或者在表名和列名周圍使用單獨的引號。

使用此方法,必須不引用任何內容或分別引用列和表以修復錯誤。

方法四:驗證密鑰是否存在

在輸入MySQL命令時,需要保證輸入了正確的命令。 交叉檢查確保客戶沒有引用目標表中不存在的表鍵。

因此,有必要糾正客戶如何使用桌子上的鑰匙。 在某些情況下,用於 ON DELETE SET NULL 的列可能沒有空定義。

為防止 MySQL 錯誤 1215,您必須確保該列設置為默認空值。

結論

本文通過四種行之有效的方法解釋了MySQL出現“#1215 – Cannot Add Foreign Key Constraint”錯誤的原因、如何查找原因以及如何修復。

感謝您抽出寶貴時間審閱本文。 我們很高興向您展示它。 在評論部分,請發表任何問題或意見。

如果您想了解最新消息,請喜歡並關注我們的 Facebook 和 Twitter 頁面。