3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
錯(cuò)誤代碼:1005 - 代碼中的主鍵引用錯(cuò)誤
通常是由于引用的外鍵字段不存在??赡苁悄阌幸粋€(gè)拼寫錯(cuò)誤,或者檢查它應(yīng)該是相同的,或者是字段類型不匹配。外鍵鏈接字段必須與定義完全匹配。
一些已知的原因可能是:
兩個(gè)關(guān)鍵字段類型和/或大小不完全匹配。例如,如果一個(gè)是
INT(10)
關(guān)鍵字段需要INT(10)
也是,而不是INT(11)
或TINYINT
。您可能需要確認(rèn)字段大小,SHOW
CREATE
TABLE
因?yàn)椴樵優(yōu)g覽器有時(shí)會(huì)直觀地顯示INTEGER
兩者INT(10)
和INT(11)
。你還應(yīng)該檢查一個(gè)不是SIGNED
,另一個(gè)是UNSIGNED
。它們都需要完全相同。您嘗試引用的關(guān)鍵字段之一沒(méi)有索引和/或不是主鍵。如果關(guān)系中的某個(gè)字段不是主鍵,則必須為該字段創(chuàng)建索引。
外鍵名稱是已存在鍵的副本。檢查外鍵的名稱在數(shù)據(jù)庫(kù)中是否唯一。只需在密鑰名稱的末尾添加一些隨機(jī)字符即可對(duì)其進(jìn)行測(cè)試。
您的一個(gè)或兩個(gè)表是一個(gè)
MyISAM
表。為了使用外鍵,表必須都是InnoDB
。(實(shí)際上,如果兩個(gè)表都是,MyISAM
那么您將不會(huì)收到錯(cuò)誤消息 - 它只是不會(huì)創(chuàng)建密鑰。)在查詢?yōu)g覽器中,您可以指定表類型。您已指定級(jí)聯(lián)
ON
DELETE
SET
NULL
,但相關(guān)鍵字段設(shè)置為NOT
NULL
。您可以通過(guò)更改級(jí)聯(lián)或?qū)⒆侄卧O(shè)置為允許NULL
值來(lái)解決此問(wèn)題。確保Charset和Collate選項(xiàng)在表級(jí)別以及關(guān)鍵列的單個(gè)字段級(jí)別都相同。
外鍵列上有一個(gè)默認(rèn)值(即默認(rèn)值= 0)
關(guān)系中的一個(gè)字段是組合(復(fù)合)鍵的一部分,并且沒(méi)有自己的單獨(dú)索引。即使該字段具有索引作為復(fù)合鍵的一部分,您也必須僅為該鍵字段創(chuàng)建單獨(dú)的索引,以便在約束中使用它。
您的
ALTER
語(yǔ)句中存在語(yǔ)法錯(cuò)誤,或者您在關(guān)系中輸入了一個(gè)字段名稱外鍵的名稱超過(guò)64個(gè)字符的最大長(zhǎng)度。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
將數(shù)據(jù)庫(kù)從一個(gè)服務(wù)器導(dǎo)出到另一個(gè)服務(wù)器時(shí),也可能發(fā)生這種情況,默認(rèn)情況下,這些表按字母順序列出。
因此,您的第一個(gè)表可能具有另一個(gè)尚未創(chuàng)建的表的外鍵。在這種情況下,請(qǐng)禁用foreign_key_checks并創(chuàng)建數(shù)據(jù)庫(kù)。
只需將以下內(nèi)容添加到腳本中:
SET FOREIGN_KEY_CHECKS=0;
它應(yīng)該工作。

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
有時(shí)它是由于主表被刪除(可能是通過(guò)禁用foreign_key_checks),但外鍵CONSTRAINT仍然存在于其他表中。在我的情況下,我放棄了桌子并嘗試重新創(chuàng)建它,但它給我?guī)?lái)了同樣的錯(cuò)誤。
因此,嘗試從所有表中刪除所有外鍵CONSTRAINT(如果有),然后更新或創(chuàng)建表。
添加回答
舉報(bào)