2017-05-30 7 views
0

私はSQLが新しく、テーブルにデータをアップロードしようとしています。このため私はCSVファイルからデータをアップロードする特別なテーブルを持っており、このテーブルからデータを最終テーブルにコピーしようとしています。MySQLでのInsert Into Selectで外来キー制約が失敗する

今、データをアップロードした中間テーブルに問題があります。テーブルには、次のとおりです。

CREATE TABLE `_work_has_person` (
    `work_id` int(11) NOT NULL, 
    `person_id` int(11) NOT NULL, 
    `primary_contribution_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`work_id`,`person_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

私が間に中間テーブルです

CREATE TABLE `work_has_person` (
    `work_id` int(11) NOT NULL, 
    `person_id` int(11) NOT NULL, 
    `primary_contribution_id` int(11) NOT NULL, 
    PRIMARY KEY (`work_id`,`person_id`), 
    KEY `fk_work_has_person_person1_idx` (`person_id`), 
    KEY `fk_work_has_person_work1_idx` (`work_id`), 
    KEY `fk_work_has_person_primary_contribution1_idx` (`primary_contribution_id`), 
    CONSTRAINT `fk_work_has_person_person1` FOREIGN KEY (`person_id`) REFERENCES `person` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `fk_work_has_person_primary_contribution1` FOREIGN KEY (`primary_contribution_id`) REFERENCES `primary_contribution` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `fk_work_has_person_work1` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

にデータをコピーしたい:

CREATE TABLE `work` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title_work` varchar(250) DEFAULT NULL, 
    `subtitle_work` varchar(250) DEFAULT NULL, 
    `date_work` varchar(45) DEFAULT NULL, 
    `unix_date_work` varchar(100) DEFAULT NULL, 
    `sinopsis` text, 
    `ref_bne` varchar(100) DEFAULT NULL, 
    `ref_alt` longtext, 
    `language_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_work_language1_idx` (`language_id`), 
    KEY `title_work` (`title_work`), 
    CONSTRAINT `fk_work_language1` FOREIGN KEY (`language_id`) REFERENCES `language` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=24610 DEFAULT CHARSET=utf8; 

CREATE TABLE `person` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL, 
    `img_person` varchar(250) DEFAULT NULL, 
    `born_date` varchar(45) DEFAULT NULL, 
    `unix_born_date` varchar(100) DEFAULT NULL, 
    `city_born_date` varchar(100) DEFAULT NULL, 
    `country_born_date` varchar(100) DEFAULT NULL, 
    `death_date` varchar(45) DEFAULT NULL, 
    `unix_death_date` varchar(100) DEFAULT NULL, 
    `city_death_date` varchar(100) DEFAULT NULL, 
    `country_death_date` varchar(45) DEFAULT NULL, 
    `biography` longtext, 
    `ref_bne` varchar(100) DEFAULT NULL, 
    `ref_alt` longtext, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name_UNIQUE` (`name`), 
    KEY `name` (`name`) 
) ENGINE=InnoDB AUTO_INCREMENT=9159 DEFAULT CHARSET=utf8; 

しかし、毎回I試してみてください

INSERT INTO work_has_person (work_id, person_id, primary_contribution_id) 
SELECT work_id, person_id, primary_contribution_id 
FROM _work_has_person; 

それは

Cannot add or update a child row: a foreign key constraint fails (`cdu93hfg93r`. 
`work_has_person`, CONSTRAINT `fk_work_has_person_person1` FOREIGN KEY (`person_id`) 
REFERENCES `person` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

私はテーブルがneccesaryデータを持っていることをかなり確信している、しかし、¿データに障害が発生したかを知るための方法があると言いますか?私はMysql error 1452 - Cannot add or update a child row: a foreign key constraint failsを見ました:しかし、ここでそれを使う方法を正確に理解していません。

A.

+0

使用して、 'からPERSON_ID選択のようなものをwork_has_personマイナス選択IDから人の '認識されない人を把握する。 –

答えて

0

データが競合を引き起こしているものを見つけることは比較的容易である:persons表にない_work_has_personからすべてperson_id秒を取得します。これは、外部結合を使用して実現でき、person.idのフィルタリングはwhere句ではnullです。

select * from `_work_has_person` whp 
left join person p on whp.person_id=p.id 
where p.id is null 

あなたが実際にあなたのinsertクエリ(内部結合)のselect一部に逆の基準を含むことによって挿入される結果から、このようなデータを削除することができます。

INSERT INTO work_has_person (work_id, person_id, primary_contribution_id) 
SELECT whp.work_id, whp.person_id, whp.primary_contribution_id 
FROM _work_has_person whp 
INNER join person p on whp.person_id=p.id 
+0

ありがとうございました!また、クエリだけでなく、説明のためにも。今、私はこの状況で何をしなければならないかを理解しています(これは非常に共通しています)。私は 'SELECT * FROM _work_has_person LEFT JOIN person b ON a.person_id = b.person_id WHERE p.id IS NULL'を実行しようとしていました。これはかなり愚かです... – Antoine

関連する問題