【问题标题】:MySQL Error 1452 - can't insert dataMySQL 错误 1452 - 无法插入数据
【发布时间】: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'

标签: mysql foreign-keys mysql-error-1452


【解决方案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 给出解决方案,但是很高兴看到提到获取孤立数据。
    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 2018-09-18
    • 2017-01-03
    • 2019-03-23
    • 2016-09-24
    • 1970-01-01
    • 2019-11-26
    • 2017-06-20
    相关资源
    最近更新 更多