錯誤程式碼 1215 無法新增外來鍵約束
當表沒有足夠的結構來處理開發人員強制要求的外來鍵(FK
)要求的快速查詢驗證時,會發生此錯誤。
CREATE TABLE `gtType` (
`type` char(2) NOT NULL,
`description` varchar(1000) NOT NULL,
PRIMARY KEY (`type`)
) ENGINE=InnoDB;
CREATE TABLE `getTogethers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` char(2) NOT NULL,
`eventDT` datetime NOT NULL,
`location` varchar(1000) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_gt2type` (`type`), -- see Note1 below
CONSTRAINT `gettogethers_ibfk_1` FOREIGN KEY (`type`) REFERENCES `gtType` (`type`)
) ENGINE=InnoDB;
注 1:由於 FK 定義在其後面的行中,因此如果需要,將自動建立這樣的 KEY。開發人員可以跳過它,如果需要,將新增 KEY(也稱索引)。下面在 someOther
中顯示了開發人員跳過它的一個例子。
到目前為止一直很好,直到下面的呼叫。
CREATE TABLE `someOther` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`someDT` datetime NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `someOther_dt` FOREIGN KEY (`someDT`) REFERENCES `getTogethers` (`eventDT`)
) ENGINE=InnoDB;
錯誤程式碼:1215。無法新增外來鍵約束
在這種情況下,由於缺少引用表 getTogethers
中的索引來處理 eventDT
的快速查詢,它失敗了。要在下一個宣告中解決。
CREATE INDEX `gt_eventdt` ON getTogethers (`eventDT`);
表 getTogethers
已被修改,現在 someOther
的建立將成功。
來自 MySQL 手冊頁使用 FOREIGN KEY 約束 :
MySQL 需要外來鍵和引用鍵上的索引,以便外來鍵檢查可以很快並且不需要表掃描。在引用表中,必須有一個索引,其中外來鍵列以相同的順序列為第一列。如果索引不存在,則會自動在引用表上建立此索引。
外來鍵和引用鍵中的相應列必須具有相似的資料型別。整數型別的大小和符號必須相同。字串型別的長度不必相同。對於非二進位制(字元)字串列,字符集和排序規則必須相同。
InnoDB 允許外來鍵引用任何索引列或列組。但是,在引用的表中,必須有一個索引,其中引用的列被列為相同順序的第一列。
請注意,最後一點是關於第一列(最左側)列以及缺少主鍵要求(儘管強烈建議)。
成功建立引用 (子)表後,使用如下命令可以看到為你自動建立的所有鍵:
SHOW CREATE TABLE someOther;
遇到此錯誤的其他常見情況包括,如上文所述,但應突出顯示:
-
在簽署的
INT
中看似微不足道的差異,指向INT UNSIGNED
。 -
開發人員無法理解多列(複合)KEYS 和第一(最左)訂購要求。