Mysql

mySQL - 無法添加外鍵約束

  • August 23, 2018

我正在嘗試添加外鍵約束,但是 mySQL 沒有採用它。沒有詳細的錯誤,只是 Cannot add foreign key constraint

這是我的出口轉儲程式碼… 感謝您的幫助

-- create tables
CREATE TABLE `calltarget` (
 `idCallTarget` int(11) NOT NULL,
 `idImportCTBatch` int(11) NOT NULL,
 `idBroker` int(11) NOT NULL,
 `idCallMaker` int(11) NOT NULL,
 `FirstName` varchar(40) DEFAULT NULL,
 `LastName` varchar(40) DEFAULT NULL,
 `StreetAddress` varchar(60) DEFAULT NULL,
 `City` varchar(30) DEFAULT NULL,
 `Province` varchar(10) DEFAULT NULL,
 `PostalCode` varchar(7) DEFAULT NULL,
 `MobilePhone` varchar(13) DEFAULT NULL,
 `HomePhone` varchar(13) DEFAULT NULL,
 `Email` varchar(80) DEFAULT NULL,
 `Broker` varchar(80) DEFAULT NULL,
 `Carrier` varchar(60) DEFAULT NULL,
 `Notes` varchar(250) DEFAULT NULL,
 `Status` int(11) DEFAULT NULL,
 `CUser` int(11) DEFAULT NULL,
 `Created` datetime DEFAULT NULL,
 `MUser` int(11) DEFAULT NULL,
 `Modified` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `importctbatch` (
 `idImportCTBatch` int(11) NOT NULL,
 `idBroker` int(11) NOT NULL,
 `idCallMaker` int(11) DEFAULT NULL,
 `ImpFileName` varchar(80) DEFAULT NULL,
 `ImpDate` datetime DEFAULT NULL,
 `ImpStep` int(11) DEFAULT '0',
 `Created` datetime DEFAULT NULL,
 `CUser` int(11) DEFAULT NULL,
 `Modified` datetime DEFAULT NULL,
 `MUser` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- add primary keys
ALTER TABLE `calltarget`
 ADD PRIMARY KEY (`idCallTarget`);

ALTER TABLE `importctbatch`
 ADD PRIMARY KEY (`idImportCTBatch`);


-- set autoincrement  
ALTER TABLE `importctbatch`
 MODIFY `idImportCTBatch` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;

ALTER TABLE `calltarget`
 MODIFY `idCallTarget` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=182;

-- restrict deletion of importctbatch when calltarget records exist
ALTER TABLE importctbatch ADD 
CONSTRAINT `fk_importctbatch_calltarget_idImportCTBatch`
    FOREIGN KEY (`idImportCTBatch`)
    REFERENCES `calltarget` (`idImportCTBatch`)
    ON DELETE RESTRICT;

我認為你把 FK 弄錯了,真的想要:

ALTER TABLE  calltarget ADD 
CONSTRAINT `fk_importctbatch_calltarget_idImportCTBatch` 
FOREIGN KEY (`idImportCTBatch`) 
REFERENCES `importctbatch` (`idImportCTBatch`) 
ON DELETE RESTRICT;

正如手冊所說

在引用的表中,必須有一個索引,其中引用的列按相同順序列為第一列

calltarget.idImportCTBatch不是任何索引的一部分。

理想情況下,您希望外鍵引用 PK 或唯一約束。

引用自:https://dba.stackexchange.com/questions/214405