掺入FK约束以删除记录,之后无法再添加回记录。的MySQL

时间:2019-02-07 20:14:46

标签: mysql foreign-keys constraints

我需要删除一些FK约束以删除表中的行,但是我想在删除后将其添加回去,但是当我尝试将其添加回去时出现此错误:

无法添加或更新子行:外键约束失败...

我知道当您尝试插入不存在的对应键时会发生此错误,但不清楚为什么在尝试将约束添加回表时出现此错误?这是一个映射表,所以可能存在一些问题?

这是原始表:

CREATE TABLE `franchise_state` (
 `franchise_id` int(11) NOT NULL,
 `state_id` int(11) NOT NULL,
 PRIMARY KEY (`franchise_id`,`state_id`),
 KEY `fk_state_id_franchise_state` (`state_id`),
 CONSTRAINT `fk_franchise_id_franchise_state` FOREIGN KEY (`franchise_id`) REFERENCES `franchise` (`franchise_id`),
 CONSTRAINT `fk_state_id_franchise_state` FOREIGN KEY (`state_id`) REFERENCES `states` (`state_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

然后我运行了这个alter table语句:

alter table franchise_state drop foreign key fk_franchise_id_franchise_state

现在的桌子是这个:

CREATE TABLE `franchise_state` (
 `franchise_id` int(11) NOT NULL,
 `state_id` int(11) NOT NULL,
 PRIMARY KEY (`franchise_id`,`state_id`),
 KEY `fk_state_id_franchise_state` (`state_id`),
 CONSTRAINT `fk_state_id_franchise_state` FOREIGN KEY (`state_id`) REFERENCES `states` (`state_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

好的,这时我删除了专营权表中的行(并删除了franchise_state中所有对应的franchise_id行),并尝试通过以下方式放回约束:

ALTER TABLE franchise_state ADD CONSTRAINT fk_franchise_id_franchise_state FOREIGN KEY (franchise_id) REFERENCES franchise(franchise_id);

但是正如开头所述,我得到“无法添加或更新子行:外部...”?

1 个答案:

答案 0 :(得分:1)

这是一个查询,可帮助您在父franchise表中查找缺失的行:

select franchise_id 
from franchise_state 
left join franchise using(franchise_id) 
where franchise.franchise_id is null; 

如果父表中缺少任何行,则创建外键将失败。