2011-04-01 44 views
5

我甩使用mysqldump用下面的命令MySQL數據庫:MySQL的負荷:在第13行錯誤1452(23000):不能添加或更新子行,外鍵約束失敗

mysqldump --no-create-db --no-create-info --compact --single-transaction --complete-insert --extended-insert=FALSE --flush-logs -uroot -ppassword databasename > databasename.db.data.dump.sql 

的我之所以用上面的特定選項是,我需要:

  1. 只轉儲數據
  2. 不會產生任何DDL語句喜歡CREATE TABLE等

我有一個腳本,生成一個清潔數據庫(即一個帶有數據結構的數據庫 - 表,索引等,但沒有數據)。

我想將使用上面的命令轉儲的數據導入CLEAN數據庫。

我試圖通過鍵入以下命令來導入轉儲的數據(即還原數據)到乾淨的數據庫:

mysql -h hostname -u user --password=password databasename < filename 

當我運行此命令,我收到以下錯誤:

ERROR 1452 (23000) at line 13: Cannot add or update a child row: a foreign key constraint fails (`tpwsdb`.`sf_guard_group_permission`, CONSTRAINT `sf_guard_group_permission_FK_2` FOREIGN KEY (`permission_id`) REFERENCES `sf_guard_permission` (`id`) ON DELETE CASCADE) 

在轉儲的數據文件,13號線是:​​

INSERT INTO `sf_guard_group_permission` (`group_id`, `permission_id`) VALUES (1,1); 

的架構sf_guard_group_p排除是:

mysql> describe sf_guard_group_permission; 
+---------------+---------+------+-----+---------+-------+ 
| Field   | Type | Null | Key | Default | Extra | 
+---------------+---------+------+-----+---------+-------+ 
| group_id  | int(11) | NO | PRI | NULL |  | 
| permission_id | int(11) | NO | PRI | NULL |  | 
+---------------+---------+------+-----+---------+-------+ 
2 rows in set (0.00 sec) 

Permission_id是FK到表sf_guard_permission。從錯誤中,似乎mysql正在嘗試填充依賴關係的表(可以這麼說的子表),然後填充父表。

在檢查轉儲的文件內容後,我可以看到,確實,依賴(子)表的INSERT語句PRECEDE對於父表而言 - 這顯然違反了表上的參照完整性約束。

然後,這個錯誤似乎是由其中通過mysqldump的,這奇怪的是,似乎漫不經心的RI

創建的INSERT語句的順序引起反正是有,我可以強制順序的mysqldump創建INSERT語句 - 即使其他表中的FK表出現在引用它們的表之前?

我會手動更改INSERT語句出現的順序,但該文件包含幾乎10K行,我不喜歡這樣做的前景。

有人在使用mysqldump之前一定遇到過這個問題 - 解決這個問題的方法是什麼?

回答

11

任何時候要導入轉儲文件到有外鍵,你應該設置以下變量一個空的數據:如果一個子行是父行之前插入

SET FOREIGN_KEY_CHECKS = 0; 

這樣,MySQL會不會拋出錯誤。

默認情況下,該變量在mysqldump中設置,但您使用--compact標誌取消了該變量。

你有兩種選擇,以解決這個問題:

1)無--compact再次運行轉儲:

mysqldump --no-create-db --no-create-info --single-transaction --complete-insert --extended-insert=FALSE --flush-logs -uroot -ppassword databasename > databasename.db.data.dump.sql 

2)導入你有轉儲,但首先禁用外鍵檢查:

mysql -h hostname -u user --password=password databasename 
SET FOREIGN_KEY_CHECKS = 0; 
\. databasename.db.data.dump.sql 
+0

是的,幾乎我所得出的結論。謝謝 .. – oompahloompah 2011-04-01 15:39:07

相關問題