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

MySQL 外鍵創建報錯 1215: Cannot add foreign key constraint 根因與解決

     編輯:MySQL 資料庫相關知識

錯誤現場

ALTER TABLE `product` 
ADD CONSTRAINT `sid_ref` 
FOREIGN KEY (`sid`) REFERENCES `sealer` (`id`) 
ON DELETE NO ACTION ON UPDATE NO ACTION;

-- ERROR 1215 (HY000): Cannot add foreign key constraint

表結構對比

product 表 (子表)

CREATE TABLE `product` (
  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sid` INT(11) NOT NULL,              -- 關鍵差異:無 UNSIGNED,長度 11
  PRIMARY KEY (`id`),
  UNIQUE KEY `sid_index` (`sid`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

sealer 表 (父表)

CREATE TABLE `sealer` (
  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,  -- UNSIGNED BIGINT
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

根因分析:三大不匹配

維度父表 sealer.id子表 product.sid結果
數據類型BIGINTINT❌ 不一致
符號屬性UNSIGNEDSIGNED (默認)❌ 不一致
顯示寬度2011⚠️ 非決定性因素
InnoDB 外鍵要求:引用列與被引用列數據類型、長度、符號屬性、字符集、校對規則完全一致。任何不匹配均導致 1215 錯誤。

解決方案:修正子表列定義

ALTER TABLE `product` 
MODIFY COLUMN `sid` BIGINT(20) UNSIGNED NOT NULL;
若子表已有數據,確保所有 sid 值在 BIGINT UNSIGNED 範圍內且父表 id 中存在,否則修改失敗或外鍵創建仍報錯。

驗證創建成功

ALTER TABLE `product` 
ADD CONSTRAINT `sid_ref` 
FOREIGN KEY (`sid`) REFERENCES `sealer` (`id`) 
ON DELETE NO ACTION ON UPDATE NO ACTION;

-- Query OK, 0 rows affected

擴展:其他常見 1215 原因速查表

原因檢查方法解決
父表非 InnoDBSHOW CREATE TABLE parentALTER TABLE parent ENGINE=InnoDB
父表無索引/非主鍵SHOW INDEX FROM parentADD INDEX 或設為 PK
字符集/校對規則不一致SHOW CREATE TABLE 兩表對比統一 CHARSET/COLLATE
數據不匹配 (子表值父表無)SELECT sid FROM product WHERE sid NOT IN (SELECT id FROM sealer)清理臟數據或補全父表
列可空性不一致DESC 兩表修正 NULL/NOT NULL

總結

Error 1215 90% 以上由列定義不匹配引起。建立外鍵前,務必對比 SHOW CREATE TABLE 確保:類型、長度、UNSIGNED、字符集、校對規則、索引存在性 六維一致。生產環境建議通過遷移腳本管理 Schema 變更,自動校驗外鍵前置條件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved