Here's a minimal case for my database scheme:
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
Well , And what we have inside:
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)
Now i need to read from an external csv file , with duplicate primary key , into the first table:
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`))
And the contents for /tmp/tar.csv:
%> cat /tmp/tar.csv
111,AAA
As i know from MySQL , it probably does a 'delete' then 'insert' , which caused the problem , it can't be deleted as the foreign key exists.
So how can i force an update to be executed , instead of a 'delete then insert' ?
Appreciate any of your responses.
From internet , i found some workable way , which suppress the checks temporarily , but is there any better response , it looks like an dirty hack , and i'm not sure if this could be a problem in multi-user environment , e.g another table with foreign key constraints may be damaged.
SET FOREIGN_KEY_CHECKS = 0;
Blabla ...
SET FOREIGN_KEY_CHECKS = 1;
Best Answer
http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
The above link clearly explains that mysqldump too puts set foreign_key_checks = 0; in the dump file so that data can be restored without the foreign key constraint error. I have always used set foreign_key_checks = 0 for importing data into tables and then set it back to 1.