在MySQL中創建外鍵約束失敗,通常由以下四個核心原因導致:
原因: 僅 InnoDB 存儲引擎支持外鍵。若表為 MyISAM、MEMORY 等引擎,創建外鍵會報錯或被忽略。
解決: 使用 ALTER TABLE table_name ENGINE=InnoDB; 轉換引擎,或創建表時指定 ENGINE=InnoDB。
原因: 外鍵定義中引用的列名必須與父表的主鍵或唯一索引列名完全一致(區分大小寫取決於操作系統)。
解決: 檢查 REFERENCES parent_table(column_name) 中的列名拼寫。
原因: 父表主鍵與子表外鍵列的數據類型(如 INT vs BIGINT)、長度(如 VARCHAR(20) vs VARCHAR(50))、簽名屬性(UNSIGNED)、字符集、排序規則必須完全相同。
解決: 使用 SHOW CREATE TABLE 對比雙方列定義,統一修改為一致定義。
原因: 即使類型長度相同,若父子表或列的字符集(如 utf8 vs utf8mb4)或排序規則(如 utf8_general_ci vs utf8_unicode_ci)不同,也會導致創建失敗。
解決: 統一表級、列級字符集:ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。
ENGINE=InnoDB。逐項核對上述條件,即可解決絕大多數「無法創建外鍵」問題。