使用infile时引用完整性错误,但使用mysql CLI时没有错误

时间:2012-12-12 20:08:53

标签: mysql foreign-keys referential-integrity

当我尝试使用--local-infile选项加载CSV数据文件时,出现以下错误:

  

第2行的错误1452(23000):无法添加或更新子行:外键约束失败(realtaxcity_desc,CONSTRAINT city_desc_ibfk_1 FOREIGN KEY({{1参考cityidcity)ON UPETE CASCADE ON UPDATE CASCADE)

错误发生在CSV文件的第一行(即根本没有加载任何行)。

这是实际的mysql加载命令:

id

以下是CSV文件的第一行:

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

但是,当我使用mysql CLI时,我可以毫无问题地加载第一行。结果如下:

  

的MySQL>插入city_desc值(NULL,1000,“R4”,“B1”,“NWC125”,“SUNRISE ACRES#1 W 120 FT OF S 75”,0.207);
  查询正常,1行受影响(0.04秒)

以下是它所引用的表格数据行:

  

的MySQL>从城市限制1中选择*;
  + ------ + --------- + ----------------- +
  | id | prop_id | pidn |
  + ------ + --------- + ----------------- +
  | 1000 | 10208 | S912999001L0800 |
  + ------ + --------- + ----------------- +
  1行(0.00秒)

以下是每个表的SQL定义:

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

我使用以下方法阅读了关于关闭参考检查的其他主题:

  

SET foreign_key_checks = 0;

但是我不想破解修复,而是想知道为什么这种方法可以手动工作,而不是使用--local-infile选项。那里有外来引用(记录号为1000),为什么它不起作用呢?

更新:以下是在插入失败后立即运行SHOW ENGINE INNODB STATUS后收到的信息:

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);

2 个答案:

答案 0 :(得分:1)

您需要跳过CSV文件的第一行,添加 IGNORE number LINES opton。

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

答案 1 :(得分:0)

根据您提供的信息,该行不应该产生任何问题。因此,快速提问: csv中有多少行?如果超过1行,其中至少有一行是否包含不在主键中的外键值?
如果该行确实包含数据数据,那么错误肯定不在该行上;它在另一排。