您好,我对sql还是很陌生,我坚持从flight261表中删除行,该表具有外键飞行员ID,飞机ID和航空公司ID。每当我尝试删除一行时,我总会得到
错误代码:1451。无法删除或更新父行:外键约束失败(
flightdb
。staff261
,CONSTRAINTstaff261_ibfk_1
外部密钥(Flight_ID261
)参考Flight261
(Flight_ID261
)。
任何帮助将不胜感激!
答案 0 :(得分:1)
创建外键时,将创建一个规则,该规则定义父表记录与子表记录的关系。默认情况下,该规则为“ ON DELETE RESTRICT”,这意味着如果有子代,则不能删除父代。但是您可以选择使用其他规则:ON DELETE CASCADE表示删除父级也会波纹删除子级,而ON DELETE SET NULL表示删除父级会将子级记录中的对应字段(引用父级)设置为null 。
要使用的规则取决于您要执行的操作。限制是“安全”规则,但其他规则也有其用途。当孩子是父母的一部分时,CASCADE是有意义的,即,如果您删除合同,那么也仅删除合同的行项目是有意义的。首先关系是可选的时,SET NULL才有意义。
但是,您的数据模型存在更大的问题。您为飞行人员建模的方式表示,每个航班可以有多个人员(好),但每个员工一次只能分配一个航班(差)。您应该再添加一张表。您的人员表应该只是人员及其属性的列表,与航班没有任何关系。然后添加一个航班到员工的交汇表(也许是“ FlightStaff”?),它有一个FK到Flight,一个FK到Staff,仅此而已。这种“连接”表是建模多对多关系的常用方法。
然后在该表上,考虑DELETE规则。在Flight和FlightStaff之间,如果要防止某人在不先取消所有工作人员的情况下删除航班,请使用RESTRICT-也许他们需要一封电子邮件来告知不参加该航班;或使用CASCADE一次将其全部删除。如果您要确保某人在没有意识到他们已经分配了一个或多个需要分配给其他人的航班的情况下,确保他们没有删除工作人员(也许这个人刚刚辞职?),请在职员和FlightStaff之间使用RESTRICT;或使用CASCADE一次将其全部删除。