Innodb

錯誤 1215:找不到解決方法

  • April 13, 2018

我目前正在建構一個數據庫並在 phpMyAdmin 上添加我的外鍵約束,但我正在努力解決其中一個問題。事實上,我在網際網路上尋找了許多可能的解決方案,但其中任何一個都對我有用。

事實是,我試圖在 AUTHOR 的CUSTOM_TRANSLATION表中添加外鍵約束,並NAME在我的USER表中使用CASCADE effect ON UPDATE and ON DELETE. 類型匹配並設置了我的索引,我仍然收到 #1215 錯誤(無法添加外鍵約束)。

我沒有粘貼整個程式碼,因為我認為它不是很有用,我猜只是粘貼了有趣的部分。

謝謝你的時間和幫助,伙計們:)

CREATE TABLE `USER` (
 `ID` tinyint(3) UNSIGNED ZEROFILL NOT NULL,
 `NAME` varchar(20) NOT NULL,
 `MAIL` varchar(50) NOT NULL,
 `PASSWORD` varchar(150) NOT NULL,
 `RANK` enum('Admin','Translator','ViewerSDTV','ViewerCustomer','Customer','TranslatorRestricted') NOT NULL,
 `SOCIETY` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `CUSTOM_TRANSLATION` (
 `ID` smallint(5) UNSIGNED ZEROFILL NOT NULL,
 `TRANSLATION_ID` smallint(5) UNSIGNED ZEROFILL NOT NULL,
 `MESSAGE_ID` smallint(5) UNSIGNED ZEROFILL NOT NULL,
 `TRANSLATED_MESSAGE` varchar(80) NOT NULL,
 `VERSION` decimal(3,2) UNSIGNED ZEROFILL NOT NULL,
 `AUTHOR` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `USER`
 ADD PRIMARY KEY (`ID`),
 ADD UNIQUE KEY `MAIL` (`MAIL`),
 ADD KEY `NAME_LINK` (`NAME`(10)) USING BTREE;

儘管 Mysql InnoDB 允許引用非唯一列或列集,但這是非常糟糕的做法,尤其不推薦使用CASCADEoption :

此外,出於性能原因,MySQL 要求對引用的列進行索引。但是,系統不強制要求引用的列必須是 UNIQUE 或聲明為 NOT NULL。對於 UPDATE 或 DELETE CASCADE 等操作,對非唯一鍵或包含 NULL 值的鍵的外鍵引用的處理沒有明確定義。建議您使用僅引用 UNIQUE(包括 PRIMARY)和 NOT NULL 鍵的外鍵。(https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

正確的做法是參考USER.ID,而不是參考USER.NAME

但是,添加和索引USER.NAME將使您可以創建所需的約束:

CREATE INDEX IDX_NAME ON USER(NAME)

如果您在創建索引時刪除了大小,您的程式碼也可以正常工作:

ALTER TABLE `USER`
 ADD PRIMARY KEY (`ID`),
 ADD UNIQUE KEY `MAIL` (`MAIL`),
 ADD KEY `NAME_LINK` (`NAME`) USING BTREE;
  --NOT `NAME_LINK` (`NAME`(10))  !!
 ALTER TABLE CUSTOM_TRANSLATION add constraint fk1 foreign key (AUTHOR) references user(name); 

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