首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 刪除外鍵報錯 errno 152 完整解析與解決方案

     編輯:MySQL 資料庫相關知識

問題背景

在 MySQL 中執行 ALTER TABLE ... DROP FOREIGN KEY 時,若出現 Error on rename of ... (errno: 152),許多開發者會誤以為是資料庫損壞或權限問題。實際上,這只是 MySQL 錯誤提示不夠友善——真正的原因通常是外鍵名稱錯誤。

錯誤重現

mysql> ALTER TABLE ruler.test2child DROP FOREIGN KEY test;
ERROR 1025 : Error on rename of './ruler/test2child' to './ruler/#sql2-298-8f' (errno: 152)

正確診斷方法

MySQL 不會直接告訴你「外鍵名稱不存在」,必須透過 SHOW INNODB STATUS 查看詳細錯誤:

mysql> SHOW INNODB STATUS\G
...
LATEST FOREIGN KEY ERROR
------------------------
071222 20:48:26 Error in dropping of a foreign key constraint of table "ruler"."test2child"
in SQL command ALTER TABLE ruler.test2child DROP FOREIGN KEY test
Cannot find a constraint with the given id "test".

核心解決步驟

  1. 先查詢正確的外鍵名稱:
    SHOW CREATE TABLE table_name; 或查詢 INFORMATION_SCHEMA.TABLE_CONSTRAINTS
  2. 使用正確的 constraint 名稱刪除:
    ALTER TABLE table_name DROP FOREIGN KEY `正確的_constraint_name`;
  3. 若需同時刪除欄位,按官方建議順序執行:
    ALTER TABLE task DROP FOREIGN KEY FK_Reference_7;
    ALTER TABLE task DROP COLUMN `assigned`;

相關操作同理可證

建立外鍵時若報 errno: 150,同樣需查看 SHOW INNODB STATUS 獲取真實原因(如 SET NULL 欄位卻定義為 NOT NULL)。

測試環境

版本:5.2.0-falcon-alpha-community-nt(早期版本行為一致,新版 MySQL 5.7+ 錯誤提示已改善,但查詢 INNODB STATUS 仍是標準診斷流程)。

最佳實踐總結

  • 永遠先用 SHOW CREATE TABLE 確認外鍵真實名稱
  • 遇到 errno 150/152 首選 SHOW INNODB STATUS 而非猜測
  • 刪除外鍵與欄位分兩步執行,避免原子性操作失敗
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved