MySQL Error 1452 - невозможно вставить данные - PullRequest
2 голосов
/ 21 декабря 2011

Я вставляю некоторые данные в следующие таблицы 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`))

Данные, которые я вставляю, в эту таблицу: Генотип1, Ген1, Генотип1, Ген2, Генотип1, Ген3, Генотип1, Ген4

В таблице генотипов есть одна копия Генотипа1, идея в том, что каждыйгенотип может содержать много генов, но каждый ген может существовать в нескольких генотипах (на данный момент существует только 1 генотип, но позже я добавлю больше).Я прочитал здесь , что я могу отключить проверку внешнего ключа, но я не хочу этого делать, не зная причину этой ошибки.Это потому, что в таблице генотипов есть только одна копия Genotype1?(Я проверил, что Genotype1, Gene1 и т. Д. Имеют одинаковый формат / орфографию в своих таблицах первичных ключей).

На всякий случай, вот код, который я использую для вставки данных:

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

Спасибо

Ответы [ 2 ]

9 голосов
/ 21 декабря 2011

Один из способов выяснить причину этого заключается в следующем:

Отключить внешние ключи

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 Checks

SET FOREIGN_KEY_CHECKS = 1;

Если ничего другого, это должно дать вам подсказку относительно почему вы получаетеошибка нарушения ограничения FK.

Удачи!

1 голос
/ 28 сентября 2018

Эта ошибка иногда появляется, когда разделитель между полями совпадает с некоторым значением, которое имеет поле. Пример: если разделитель - запятая (,). Возможно, какое-то поле имеет эту запятую и считает, что это смена поля. Проверьте эти случаи.

...