2

次の 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;

最初に遺伝子型/遺伝子にデータを挿入しましたが、遺伝子型遺伝子に挿入しようとすると次のエラーが発生します。

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

このテーブルに挿入するデータは次のとおりです: Genotype1,Gene1 Genotype1,Gene2 Genotype1,Gene3 Genotype1,Gene4

遺伝子型テーブルには Genotype1 のコピーが 1 つあり、各遺伝子型には多くの遺伝子を含めることができますが、各遺伝子は複数の遺伝子型に存在する可能性があります (現時点では遺伝子型は 1 つしかありませんが、後で追加します)。ここで、外部キー チェックをオフにできることを読みましたが、このエラーの理由を知らずにそうするのは気が進まないのです。これは、遺伝子型テーブルに Genotype1 のコピーが 1 つしかないためですか? (Genotype1、Gene1 などが主キー テーブルで同じ形式/スペルであることを確認しました)。

念のため、データを挿入するために使用しているコードを次に示します。

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

ありがとう

4

2 に答える 2

9

これを引き起こしている原因を突き止めるための 1 つの方法は、次のことです。

外部キーを無効にする

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 制約違反エラーが発生する理由についての手がかりが得られるはずです。

幸運を!

于 2011-12-21T11:16:47.620 に答える