Innodb
錯誤 1215:找不到解決方法
我目前正在建構一個數據庫並在 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 允許引用非唯一列或列集,但這是非常糟糕的做法,尤其不推薦使用
CASCADE
option :此外,出於性能原因,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);