MySQL 5.6.24:外键出现ERROR 1452(23000)错误

时间:2017-02-08 09:53:49

标签: mysql foreign-keys

我面临一个奇怪的问题。这很复杂,所以请耐心等待。

我有3个包含以下架构的表:

CREATE TABLE `org_tbl` (
  `OrgID` int(11) NOT NULL,
  `Title` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`OrgID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `grp_tbl` (
  `GroupID` int(11) NOT NULL,
  `FkOrgID` int(11) NOT NULL,
  `Title` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`GroupID`,`FkOrgID`),
  KEY `fk_grp_tbl_FkOrgID_org_tbl_OrgID` (`FkOrgID`),
  CONSTRAINT `fk_grp_tbl_FkOrgID_org_tbl_OrgID` FOREIGN KEY (`FkOrgID`) REFERENCES `org_tbl` (`OrgID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8


CREATE TABLE `parent_child_grp` (
  `ChildGroupID` int(11) NOT NULL,
  `GroupID` int(11) NOT NULL,
  `FkOrgID` int(11) NOT NULL,
  `Title` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`ChildGroupID`,`GroupID`),
  KEY `fk_cg_ChildGroupID_FkOrgID_pg_GroupID_FkOrgID` (`ChildGroupID`,`FkOrgID`),
  KEY `fk_cg_GroupID_FkOrgID_pg_GroupID_FkOrgID` (`GroupID`,`FkOrgID`),
  CONSTRAINT `fk_cg_ChildGroupID_FkOrgID_pg_GroupID_FkOrgID` FOREIGN KEY (`ChildGroupID`, `FkOrgID`) REFERENCES `grp_tbl` (`GroupID`, `FkOrgID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_cg_GroupID_FkOrgID_pg_GroupID_FkOrgID` FOREIGN KEY (`GroupID`, `FkOrgID`) REFERENCES `grp_tbl` (`GroupID`, `FkOrgID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

现在,如果以下是数据集:

mysql> SELECT * FROM org_tbl;

OrgID       Title
2           b
3           a

mysql> SELECT * FROM grp_tbl;

GroupID     FkOrgID     Title
1           3           pg_a
2           3           pg_b

mysql> SELECT * FROM parent_child_grp;

ChildGroupID    GroupID     FkOrgID     Title
1               1           3           cg_a
2               1           3           cg_b

然后当我尝试使用:

更新org_tbl中的OrgID值时
UPDATE org_tbl SET OrgID = 1 WHERE OrgID = 3;

我收到以下错误:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`parent_child_grp`, CONSTRAINT `fk_cg_GroupID_FkOrgID_pg_GroupID_FkOrgID` FOREIGN KEY (`GroupID`, `FkOrgID`) REFERENCES `grp_tbl` (`GroupID`, `FkOrgID`) ON DELETE CASCADE ON UPD)

所以在上面的架构中发生的是

  1. parent_child_grp(ChildGroupID,FkOrgID)=> grp_tbl(GroupID,FkOrgID)
  2. parent_child_grp(GroupID,FkOrgID)=> grp_tbl(GroupID,FkOrgID)
  3. 如果我删除第二个外键约束[即parent_child_grp(GroupID,FkOrgID)=> grp_tbl(GroupID,FkOrgID)],然后一切正常。

    **注意:所有表格都有外键:

    ON DELETE CASCADE ON UPDATE CASCADE
    

    现在我无法理解为什么会这样。

    请帮忙。

1 个答案:

答案 0 :(得分:1)

当您尝试将OrgID值更新为1时,grp_tbl表格和parent_child_grp表格FkOrgID列仍包含值3。

由于FkOrgID是外键,具体取决于OrgID,因此此更新会使FkOrgID列的值3不是{{1}中的值}}。 这违反了FK条件

这就是您收到此错误的原因