【问题标题】:Dopped FK constraint to delete a record and cannot add it back after. MySQL使用 FK 约束来删除一条记录,之后不能再添加它。 MySQL
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多