这是我的数据库方案的最小案例:
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)
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。
归档时间: |
|
查看次数: |
3080 次 |
最近记录: |