2

--local-infile オプションを使用して CSV データのファイルを読み込もうとすると、次のエラーが発生します。

行 2 のエラー 1452 (23000): 子行を追加または更新できません: 外部キー制約が失敗しました ( realtax. city_desc, CONSTRAINT city_desc_ibfk_1FOREIGN KEY ( cityid) REFERENCES city( id) ON DELETE CASCADE ON UPDATE CASCADE)

エラーは CSV ファイルの最初の行で発生します (つまり、行がまったくロードされません)。

実際の mysql ロード コマンドは次のとおりです。

load data LOCAL infile 'out/desc.in' into table city_desc fields terminated by ',' lines terminated by '\n';

CSV ファイルの最初の行は次のとおりです。

# head -1 out/desc.in
NULL,1000,"R4","B1","NWC125","SUNRISE ACRES #1 W 120 FT OF S 75",0.207

ただし、mysql CLI を使用すると、最初の行を問題なくロードできます。結果は次のとおりです。

mysql> city_desc 値に挿入 (NULL,1000,"R4","B1","NWC125","SUNRISE ACRES #1 W 120 FT OF S 75",0.207);
クエリ OK、影響を受ける 1 行 (0.04 秒)

これが参照するテーブル データの行は次のとおりです。

mysql> select * from city limit 1;
+--------+---------------------+-----------------+
| ID | prop_id | ぴどん |
+--------+---------------------+-----------------+
| 1000 | 10208 | S912999001L0800 |
+------+---------+-----------------+
1 行セット (0.00 秒)

各テーブルの SQL 定義は次のとおりです。

create table if not exists city 
(
    id              INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    prop_id         int,
    pidn            varchar(100)
) AUTO_INCREMENT=1000, engine=innodb;

create table if not exists city_desc
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    cityid          int not null,
    zoning          varchar(20), 
    state_cd        varchar(20), 
    map_id          varchar(20), 
    legal_desc      varchar(100), 
    legal_acres     numeric(5,5),
    foreign key (cityid) references city(id)
    on update cascade on delete cascade
) AUTO_INCREMENT=500000, engine=innodb;

create index propid_city on city(prop_id);
create index pidn_city on city(pidn);

次を使用して参照チェックをオフにすることについて、他のスレッドを読みました。

外部キー チェックを設定 = 0;

しかし、修正をハッキングする代わりに、これが --local-infile オプションではなく手動で機能する理由を知りたいです。外部参照が存在する (レコード ID 1000) のに、なぜ機能しないのでしょうか?

更新: 挿入が失敗した直後に SHOW ENGINE INNODB STATUS を実行した後に受け取った情報は次のとおりです。

------------------------
LATEST FOREIGN KEY ERROR
------------------------
121212 13:50:55 Transaction:
TRANSACTION 0 901853, ACTIVE 0 sec, process no 3217, OS thread id 140224990570240 inserting, thread declared inside InnoDB 492
mysql tables in use 1, locked 1
5 lock struct(s), heap size 1216, 9 row lock(s), undo log entries 9
MySQL thread id 15389, query id 1442612 localhost root
load data LOCAL infile 'out/desc.in' into table city_desc fields terminated by ',' lines terminated by '\n'
Foreign key constraint fails for table `realtax`.`city_desc`:
,
  CONSTRAINT `city_desc_ibfk_1` FOREIGN KEY (`cityid`) REFERENCES `city` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
Trying to add in child table, in index `cityid` tuple:
DATA TUPLE: 2 fields;
 0: len 4; hex 80000000; asc     ;; 1: len 4; hex 800ea15e; asc    ^;;

But in parent table `realtax`.`city`, in index `PRIMARY`,
the closest match we can find is record:
PHYSICAL RECORD: n_fields 5; compact format; info bits 0
 0: len 4; hex 800003e8; asc     ;; 1: len 6; hex 00000007aed1; asc       ;; 2: len 7; hex 800000002d0110; asc     -  ;; 3: len 4; hex 800027e0; asc   ' ;; 4: len 15; hex 533931323939393030314c30383030; asc S912999001L0800;;
4

2 に答える 2

1

CSV ファイルの最初の行をスキップし、 IGNORE number LINESオプションを追加する必要があります。

load data LOCAL infile 'out/desc.in'
into table city_desc
fields terminated by ','
lines terminated by '\n'
ignore 1 lines;
于 2012-12-12T20:17:47.067 に答える
0

あなたが提示した情報に基づいて、その行は問題を引き起こさなかったはずです. したがって、簡単な質問: csv には何行ありますか? 複数の行がある場合、それらの少なくとも 1 つに、主キーにない外部キー値が含まれていますか?
行に実際にデータ data が含まれている場合、エラーは間違いなくその行にはありません。それは別の行にあります。

于 2012-12-12T22:47:04.067 に答える