首页 > 解决方案 > 从具有外键约束的表中删除行

问题描述

乐威

您好,我对 sql 很陌生,我一直坚持从 flight261 表中删除行,该表具有外键 Pilot ID、Aircraft ID 和 Airlines ID。每当我尝试删除一行时,我总是得到

错误代码:1451。无法删除或更新父行:外键约束失败(flightdb. staff261, CONSTRAINT staff261_ibfk_1FOREIGN KEY ( Flight_ID261) REFERENCES Flight261( Flight_ID261))。

任何帮助,将不胜感激!

标签: mysqlsqldatabaseforeign-keyssql-delete

解决方案


当您创建外键时,会创建一个规则来定义父表记录与子表记录的关联方式。默认情况下,该规则为 ON DELETE RESTRICT,这意味着如果有子项,则无法删除父项。但是您可以选择使用其他规则: ON DELETE CASCADE 意味着删除父级也会涟漪删除子级,而 ON DELETE SET NULL 意味着删除父级将在子记录中将相应字段(引用父级)设置为 null .

使用哪个规则取决于您要执行的操作。RESTRICT 是“安全”规则,但其他规则有其用途。当子级是父级的一部分时,CASCADE 才有意义,即,如果您删除发票,则只有删除发票的行项目才有意义。当关系首先是可选的时,SET NULL 才有意义。

但是,您的数据模型存在更大的问题。您为航班建模人员的方式表明每个航班可以有多个员工(好),但每个员工一次只能分配一个航班(坏)。您应该再添加一张桌子。您的员工表应该只是一个员工列表及其属性,与航班没有任何关系。然后添加一个航班到员工的连接表(可能是“FlightStaff”?),它有一个 FK 到 Flight,一个 FK 到 Staff,仅此而已。这种“联结”表是建模多对多关系的常用方法。

然后在该表上,考虑 DELETE 规则。在 Flight 和 FlightStaff 之间,如果您想阻止某人在不先取消分配所有员工的情况下删除航班,请使用 RESTRICT - 也许他们需要一封电子邮件来知道不会出现在该航班上;或使用 CASCADE 一次将其全部删除。在 Staff 和 FlightStaff 之间,如果您想确保某人不会删除某个工作人员(也许该人刚刚退出?),而没有意识到他们分配了一个或多个航班需要分配给其他人,请在 Staff 和 FlightStaff 之间使用;或使用 CASCADE 一次将其全部删除。


推荐阅读