MySQL 错误 1452 - 无法插入数据

Posted

技术标签:

【中文标题】MySQL 错误 1452 - 无法插入数据【英文标题】:MySQL Error 1452 - can't insert data 【发布时间】:2012-01-25 04:23:16 【问题描述】:

我正在向以下 mysql 表中插入一些数据:

CREATE TABLE genotype
(
Genotype VARCHAR(20),
Fitness FLOAT NULL,
Tally INT NULL,
PRIMARY KEY (Genotype)
)ENGINE=InnoDB;


CREATE TABLE gene
(
Gene VARCHAR(20),
E FLOAT NOT NULL,
Q2 FLOAT NOT NULL, 
PRIMARY KEY (Gene)
)ENGINE=InnoDB;

CREATE TABLE genotypegene
(
Genotype VARCHAR(20),
Gene VARCHAR(20),
FOREIGN KEY (Genotype) REFERENCES genotype(Genotype),
FOREIGN KEY (Gene) REFERENCES gene(Gene)
)ENGINE=InnoDB;

我先将数据插入到 genotype/gene 中,但尝试插入到 genotypegene 时出现以下错误:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`populationdb`.`genotypegene`, CONSTRAINT `genotypegene_ibfk_2` FOREIGN KEY (`Gene`) REFERENCES `gene` (`Gene`))

我要插入到此表中的数据是: 基因型1,基因1 基因型1,基因2 基因型1,基因3 基因型1,基因4

基因型表中有一个Genotype1的副本,想法是每个基因型可以包含多个基因,但每个基因可以存在多个基因型(目前只有1个基因型,但稍后我会插入更多)。我读到here 说我可以关闭外键检查,但我不愿意在不知道此错误原因的情况下这样做。这是因为基因型表中只有一个 Genotype1 副本吗? (我检查了 Genotype1、Gene1 等在其主键表中的格式/拼写相同)。

以防万一,这里是我用来插入数据的代码:

 mysql> LOAD DATA LOCAL INFILE 'C:\\.....genotypegene.csv'
   -> INTO TABLE genotypegene
   -> FIELDS TERMINATED BY ','
   -> (Genotype, Gene);

谢谢

【问题讨论】:

您是否尝试使用“INSERT”而不是“LOAD DATA”添加数据?可能字段之间有一些空格,通过 LOAD DATA 插入时会包含这些空格。 错误告诉我们Gene 表中缺少父数据。您是否检查过您尝试填充genotypegene.Gene 列的所有数据是否存在于Gene 表中?此外,您是否检查了 CSV 值或 gene.Gene 列中的空白?值的情况(上、下等)也是如此。可能也会绊倒你.. 这行得通,谢谢-我没有想到,因为在我添加外键之前,完全相同的数据插入得很好,但我想那是因为它不在乎它有空格. 如何从 CSV 文件中删除空格(手动编辑 - 似乎没有)。它可以很好地手动插入,这对于我目前拥有的少量数据来说很好,但最终我需要使用 LOAD DATA 插入 @Lisa 如果您的值中没有空格,您可以在任何文本编辑器中轻松替换 ''(空白)上的 ''(无),直到没有任何空白。如果值中有wahitespaces,最好使用RegExp,例如,您可以使用sedsed -e 's/ *, */,/g < infile > outfile' 【参考方案1】:

当字段之间的分隔符与字段具有的某个值重合时,有时会出现此错误。示例:如果分隔符是逗号 (,)。可能某些字段有这个逗号,并认为这是一个字段更改。检查这些情况。

【讨论】:

【参考方案2】:

找出原因的一种方法是执行以下操作:

禁用外键

SET FOREIGN_KEY_CHECKS = 0;

加载数据

使用您的命令执行此操作:

mysql> LOAD DATA LOCAL INFILE 'C:\\.....genotypegene.csv'
    -> INTO TABLE genotypegene
    -> FIELDS TERMINATED BY ','
    -> (Genotype, Gene);

查找孤立数据

select gtg.* from genotypegene gtg
where (gtg.Gene not in (select g.Gene from gene g) 
    or gtg.Genotype not in (select gt.Genotype from genotype gt));

这应该会为您提供导致您违反 FK 约束的行的列表。

修复孤立数据

更新它们?删除它们?在 CSV 中修复它们?将父行插入Gene 表?做任何适当的事。

启用 FK 检查

SET FOREIGN_KEY_CHECKS = 1;

如果没有其他问题,这应该可以让您了解为什么您会收到 FK 约束违规错误。

祝你好运!

【讨论】:

谢谢你,原来是我所有的行都有问题,但这对未来很有用 +1 很多人会通过设置FOREIGN_KEY_CHECKS = 0 给出解决方案,但是很高兴看到提到获取孤立数据。

以上是关于MySQL 错误 1452 - 无法插入数据的主要内容,如果未能解决你的问题,请参考以下文章

错误 1452 MySQL 和 NodeJS。为啥数据库不能正确引用我的表?

尝试插入外键时出现错误 #1452

MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败

MySQL 不能用 FK 约束插入

完整性约束违规:1452 无法将子行添加或更新到我的数据库中

mysql1452错误