【发布时间】:2019-02-07 20:14:45
【问题描述】:
为了删除表中的一行,我需要删除一些 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
好的,此时我删除了特许经营表中的行(并删除了特许经营状态中所有相应的特许经营ID行)并尝试将约束放回:
ALTER TABLE franchise_state ADD CONSTRAINT fk_franchise_id_franchise_state FOREIGN KEY (franchise_id) REFERENCES franchise(franchise_id);
但如开头所述,我得到“无法添加或更新子行:外国...”??
【问题讨论】:
-
运行
SHOW ENGINE INNODB STATUS并查看 LATEST FOREIGN KEY ERROR 部分。它应该为您提供更多有关问题所在的线索。 -
您不应该仅仅为了删除数据而删除外键。您应该先删除子行,然后删除
franchise中的父行。 -
好吧,让我看看。一秒
-
好的。得到一个带有十六进制代码的真正日志错误描述。太大了,不能贴在这里。我将添加一些可能有帮助的关键行: DATA TUPLE: 4 fields; 0:长度 4;十六进制 80000080;升序;; 1:长度 4;十六进制 80000033;升 3;; 2:长度 6;十六进制 000000617bde; asc { ;; 3:长度 7;十六进制 af00001f33101a;升序
-
找到丢失的franchise_id:
select franchise_id from franchise_state left join franchise using(franchise_id) where franchise.franchise_id is null;
标签: mysql foreign-keys constraints