2017-05-30 84 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