更新:該死的 - 難道你不知道,我發佈的那一分鐘我得到了哈哈!主表需要先創建。在MySQL中添加外鍵失敗 - errno 150 - 使用mysqldump
更新2:對於任何人後,問題是與我的mysqldump命令包含--compact選項。這刪除了包括FOREIGN_KEY_CHECKS = 0的mysqldump功能;在轉儲文件的頂部。現在,緊湊的刪除,問題完全解決。無需手動將其插入到我的轉儲文件中。
我可以在執行mysqldump時指定表的順序嗎?
我正在上傳localhost MySQL數據庫到我的共享服務器。嘗試重新創建帶有外鍵的表時出現以下錯誤。 「#1005 - 無法創建表'username_test.gemdetail'(errno:150)」sql語句如下。當刪除約束條款時,這些表導入就好了)
從MySQL - FOREIGN KEY約束文檔: 如果您重新創建了已刪除的表,它必須具有符合外鍵約束的定義引用它。如前所述,它必須具有正確的列名和類型,並且必須在引用的鍵上有索引。如果這些不滿足,MySQL將返回錯誤號1005並引用錯誤消息中的錯誤150。
我已經檢查瞭如下條件(糾正我,請我是否錯過了什麼):
1)這兩個表必須是ENGINE = InnoDB的。 - 是 2)兩個表必須具有相同的字符集。 - 是 3)父表中的PK列和FK列必須是相同的數據類型。 - 是 4)父表和FK列中的PK列(如果它們具有定義歸類類型)必須具有相同的歸類類型; - 未定義 5)如果外鍵表中已有數據,則FK列值必須與父表PK列中的值匹配。 - 無數據 6)而子表不能作爲臨時表。 - N/A
我也嘗試導入到一個新的空數據庫。有任何想法嗎?在此先感謝您的幫助。
是mysqldump的生成SQL代碼的相關部分(我已經刪除其他列可讀性的緣故&密鑰,但這種精簡的代碼產生相同的結果):
DROP TABLE IF EXISTS `gemdetail`;
CREATE TABLE `gemdetail` (
`gemdetailid` int(10) NOT NULL AUTO_INCREMENT,
`gemid` int(10) NOT NULL,
PRIMARY KEY (`gemdetailid`),
KEY `gemid` (`gemid`),
CONSTRAINT `gemdetail_ibfk_1` FOREIGN KEY (`gemid`) REFERENCES `gems` (`gemid`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=875 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `gems`;
CREATE TABLE `gems` (
`gemid` int(10) NOT NULL AUTO_INCREMENT,
`userid` int(10) NOT NULL,
PRIMARY KEY (`gemid`),
KEY `userid` (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=528 DEFAULT CHARSET=utf8;
最後的數據庫版本信息:
服務器:通過UNIX套接字的本地主機 軟件:MySQL 軟件版本:5.5。32-log - MySQL社區服務器(GPL)(BetterLinux 01 Sep 5 2013 23:04:40) 協議版本:10
是的,有時我們並不總是知道真正的問題是什麼。至於不清楚,@Filipe Silva能夠給出答案而不會產生一個全新的問題。與其他帖子一樣,任何在這個問題上搜索的人經常會遇到這些問題。 – mseifert