web-dev-qa-db-ja.com

MySQL 'LOAD DATA INFILE':外部キーが存在する場合、エントリを置換できません

これが私のデータベーススキームの最小のケースです:

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

さて、そして私たちの中にあるもの:

    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)

次に、重複する主キーを持つ外部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`))

そして/tmp/tar.csvの内容:

%> cat /tmp/tar.csv 
111,AAA

MySQLから知っているように、おそらく「削除」してから「挿入」して問題を引き起こしましたが、外部キーが存在するため削除できません。では、「削除してから挿入」ではなく、更新を強制的に実行するにはどうすればよいですか?

あなたの応答を感謝します。

インターネットから、私は一時的にチェックを抑制するいくつかの実用的な方法を見つけましたが、より良い応答はありますか、それは汚いハックのように見えます、そしてこれがマルチユーザー環境で問題になる可能性があるかどうかわかりません外部キー制約があると、損傷する可能性があります。

SET FOREIGN_KEY_CHECKS = 0;
Blabla ...
SET FOREIGN_KEY_CHECKS = 1;
6
daisy

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に戻しました。

6
dbachacha