簡體   English   中英

在MySQL中添加外鍵失敗-錯誤碼150-使用mysqldump

[英]Adding Foreign Key Fails in MySQL - errno 150 - using mysqldump

更新:達恩-你不知道我發布那一刻我就得到了啊哈! 主表需要在創建中排在第一位。

更新2:對於以下任何人,問題出在我的mysqldump命令包含--compact選項。 這刪除了包括FOREIGN_KEY_CHECKS = 0在內的mysqldump功能; 在轉儲文件的頂部。 現在,刪除壓縮后,該問題已完全解決。 無需手動將其插入我的轉儲文件中。

進行mysqldump時可以指定表的順序嗎?

我正在將本地主機MySQL數據庫上傳到共享服務器。 我在嘗試用外鍵重新創建表時遇到以下錯誤。 “#1005-無法創建表'username_test.gemdetail'(errno:150)”該sql語句如下。 刪除Constraint子句后,表導入就可以了)

來自MySQL-FOREIGN KEY Constraints文檔:如果重新創建已刪除的表,則該表必須具有符合引用該表的外鍵約束的定義。 如前所述,它必須具有正確的列名和類型,並且必須在引用的鍵上具有索引。 如果不滿足這些條件,MySQL將返回錯誤號1005,並在錯誤消息中引用錯誤150。

我檢查了以下情況(如果我錯過了一些情況,請糾正我):

1)兩個表必須為ENGINE = InnoDB。 -是2)兩個表必須具有相同的字符集。 -是3)父表中的PK列與FK列的數據類型必須相同。 -是4)父表中的PK列和FK列(如果具有定義排序規則類型)必須具有相同的排序規則類型; -未定義5)如果外鍵表中已經有數據,則FK列值必須與父表PK列中的值匹配。 -無數據6)子表不能是臨時表。 -不適用

我還嘗試了導入到新的空數據庫。 有任何想法嗎? 在此先感謝您的幫助。

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套接字通過Localhost軟件:MySQL軟件版本:5.5.32-log-MySQL社區服務器(GPL)(BetterLinux 2013年9月5日23:04:40)協議版本:10

您必須首先創建表gem,因為您在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演示

要在mysqldump之后創建表並且不給出外鍵錯誤,請打開轉儲文件,將此語句放在開頭:

SET FOREIGN_KEY_CHECKS=0; 

您應該在“ gemdetail”之前創建“ gems”,並切換創建查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM