2013-10-15 71 views
0

更新:該死的 - 難道你不知道,我發佈的那一分鐘我得到了哈哈!主表需要先創建。在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

+0

是的,有時我們並不總是知道真正的問題是什麼。至於不清楚,@Filipe Silva能夠給出答案而不會產生一個全新的問題。與其他帖子一樣,任何在這個問題上搜索的人經常會遇到這些問題。 – mseifert

回答

2

您必須先創建表格寶石,因爲您在gemdetail表中引用它,所以它已經存在:

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; 

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; 

sqlfiddle demo

要創建的mysqldump後的表,而不是給外鍵的錯誤,打開把這個聲明開頭的轉儲文件:

SET FOREIGN_KEY_CHECKS=0; 
+0

是的,這是最終的解決方案和解決問題的方法。謝謝。 – mseifert

+0

我的意思是給它一個大拇指(他在你身後數秒)。我糾正了它。再次感謝。 – mseifert

+0

沒問題。真高興你做到了。 –

1

您應該在「gemdetail」之前創建「寶石」,切換創建查詢。

+0

我得到了哈哈!在我發佈後回答第二個問題。感謝您迅速回復。現在的問題是我可以使用mysqldump來正確放置表的順序?目前我使用:mysqldump -h localhost -u用戶-ppassword --compact --add-drop-table --quick dbname> dump.sql – mseifert

+0

對不起,我還沒有聽到某些東西,如東西...我搜索了一個但沒有什麼... 禁用foreign_key_checks只會讓你的插入查詢更快,它不是爲了忽略創建問題 – tanaydin

+1

它更快的插入*和*以任意順序創建表的能力:http:// dev。 mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html ...缺失外鍵約束的目標是默默允許的,而不匹配(例如針對不同數據類型的列)仍然會拋出錯誤。 –

相關問題