我面临一个奇怪的问题。这很复杂,所以请耐心等待。
我有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)
所以在上面的架构中发生的是
如果我删除第二个外键约束[即parent_child_grp(GroupID,FkOrgID)=> grp_tbl(GroupID,FkOrgID)],然后一切正常。
**注意:所有表格都有外键:
ON DELETE CASCADE ON UPDATE CASCADE
现在我无法理解为什么会这样。
请帮忙。
答案 0 :(得分:1)
当您尝试将OrgID
值更新为1时,grp_tbl
表格和parent_child_grp
表格FkOrgID
列仍包含值3。
由于FkOrgID
是外键,具体取决于OrgID
,因此此更新会使FkOrgID
列的值3
不是{{1}中的值}}。
这违反了FK条件。
这就是您收到此错误的原因