MySQL 'LOAD DATA INFILE':当外键存在时无法替换条目

dai*_*isy 6 mysql innodb php

这是我的数据库方案的最小案例:

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `name` varchar(22) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 CREATE TABLE `test2` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `test2_ibfk_1` FOREIGN KEY (`id`) REFERENCES `test` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

好吧,还有我们里面的东西:

    mysql> select * from test;
+-----+-------+
| id  | name  |
+-----+-------+
| 111 | AAABA |
+-----+-------+
1 row in set (0.00 sec)

mysql> select * from test2;
+-----+
| id  |
+-----+
| 111 |
+-----+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

现在我需要从具有重复主键的外部 csv 文件中读取到第一个表中:

mysql> LOAD data infile '/tmp/tar.csv' REPLACE INTO TABLE test FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`eduman`.`test2`, CONSTRAINT `test2_ibfk_1` FOREIGN KEY (`id`) REFERENCES `test` (`id`))
Run Code Online (Sandbox Code Playgroud)

以及 /tmp/tar.csv 的内容:

%> cat /tmp/tar.csv 
111,AAA
Run Code Online (Sandbox Code Playgroud)

正如我从 MySQL 知道的,它可能先“删除”然后“插入”,这导致了问题,由于外键存在,因此无法删除。那么如何强制执行更新,而不是“删除然后插入”?

感谢您的任何回应。

从互联网上,我找到了一些可行的方法,可以暂时抑制检查,但是有没有更好的响应,它看起来像一个肮脏的黑客,我不确定这是否可能是多用户环境中的问题,例如另一个表带有外键约束的可能会损坏。

SET FOREIGN_KEY_CHECKS = 0;
Blabla ...
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)

dba*_*cha 6

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

上面的链接清楚地解释了 mysqldump 也把 set foreign_key_checks = 0; 在转储文件中,以便可以在没有外键约束错误的情况下恢复数据。我一直使用 set foreign_key_checks = 0 将数据导入表中,然后将其设置回 1。