在MySQL中使用Insert Into Select,外键约束失败

时间:2017-05-30 18:41:21

标签: mysql

我对SQL很新,我正在尝试将数据上传到我的表中。为此,我有一些特殊的表格,我从CSV文件上传数据,然后,从这个表格,我试图将数据复制到最终表格。

但是现在我有一个中间表的问题,我上传了我的数据。该表是:

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)

我很确定这些表有必要的数据,但是,有没有办法知道哪些数据失败了?我看过Mysql error 1452 - Cannot add or update a child row: a foreign key constraint fails:但不明白如何在这里使用它。

一个。

1 个答案:

答案 0 :(得分:0)

找出导致冲突的数据相对容易:从person_id获取_work_has_person表中不在persons表中的所有person.id。您可以通过外部联接实现此目的,并且在where子句中对select * from `_work_has_person` whp left join person p on whp.person_id=p.id where p.id is null 的过滤为null。

select

您实际上可以通过将反向标准包含在insert查询的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 部分(内部联接)中,从插入的结果中删除此类数据:

{{1}}