錯誤程式碼 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 和第一(最左)訂購要求。