2016-02-05 46 views
0

我創建使用mysqldumnp一個SQL文件(從MySQL 27年6月5日),並使用它來重新創建一個數據庫(MySQL的5.7.9)正在外鍵約束(1215):MySQL的 - 不能添加

CREATE TABLE `my_table` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `email` varchar(255) DEFAULT NULL, 
    `user_id` bigint(20) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`), 
    CONSTRAINT `my_table_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; 

我得到這個錯誤:

[Err] 1215 - Cannot add foreign key constraint

然後我跑了查詢SHOW ENGINE INNODB STATUS,得到了如下形式的最新FOREIGN KEY錯誤「的標題:

2016-02-05 12:27:08 0x7f1b8f54b700 Error in foreign key constraint of table my_db/my_table: FOREIGN KEY (user_id) REFERENCES users (user_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT: Cannot resolve table name close to: (user_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

我也試過在運行set FOREIGN_KEY_CHECKS = 0;之後運行這個SQL命令,但是我仍然得到相同的錯誤。

這似乎表明users表必須在我可以運行此查詢之前到位。但是,我有另一部分SQL轉儲(此部分之前)具有引用完全相同的表和列的外鍵約束,並且此運行沒有任何錯誤。

所以我, 1)困惑,爲什麼發生這種情況和 2)好奇,想知道是否有指示的mysqldump轉儲文件格式,以這樣的方式,該命令創建的表是任何方法首先在轉儲文件中添加外鍵的命令隨後出現,從而避免了不存在的表的問題。

注意:我還使用Navicat中的Data Tranfer工具在轉儲文件包含的同一個數據庫中進行復制,並且它運行正常。這似乎表明,無論常規Navicat使用Mananges來處理約束,而嘗試使用命令行導入轉儲文件不會。

+0

請給我們的用戶顯示你的表 – Jens

+0

當CREATE TABLE my_table命令運行時,表'用戶'不存在,那你爲什麼要看這個? – JoeTidee

+0

您爲此表創建一個外鍵,因此它存在 – Jens

回答

1

打開.sql備份文件並在users之後移動my_table的SQL腳本(創建並插入),然後再次運行恢復過程。

user表必須在創建引用的外鍵之前存在。

也許其他表也會有同樣的問題,確保表依賴關係是好的。

+1

我很驚訝,MySQL轉儲不會淹沒在文件的末尾添加密鑰約束代碼。 – JoeTidee