2017-05-30 82 views
0

我對SQL很陌生,我試圖將數據上傳到我的表中。爲此,我有特殊的表格,我從CSV文件上傳數據,然後從這張表格中,我試圖將數據複製到最終表格。外鍵約束失敗,並在MySQL中插入選擇

但現在我有一箇中間表的問題,我已經上傳了我的數據。該表是:

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; 

但每次我嘗試運行

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

這是比較容易找出數據導致衝突:從_work_has_person得到所有person_id s表示不在persons表。您可以通過外部聯接實現此目的,並且在where子句中篩選person.id爲空。

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

謝謝你!不僅用於查詢,還用於解釋。現在我明白在這種情況下我必須做什麼(這是非常普遍的)。我試圖做'選擇*從_work_has_person左加入人b在a.person_id = b.person_id WHERE p.id IS NULL',這是非常愚蠢的... – Antoine