mysql - 从具有外键约束的表中删除行

标签 mysql sql database foreign-keys sql-delete

le wi

您好,我对 sql 相当陌生,我一直在从 Flight261 表中删除行,该表具有外键飞行员 ID、飞机 ID 和航空公司 ID。每当我尝试删除一行时,我总是得到

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (flightdb.staff261, CONSTRAINT staff261_ibfk_1 FOREIGN KEY (Flight_ID261) REFERENCES Flight261 (Flight_ID261)).

如有任何帮助,我们将不胜感激!

最佳答案

创建外键时,会创建一条规则来定义父表记录如何与子表记录相关。默认情况下,该规则为 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 之间,如果您想确保某人不会在没有意识到他们已分配一个或多个航类需要分配给其他人的情况下删除某个工作人员(也许该人刚刚辞职?),请使用 RESTRICT;或者使用CASCADE一次性全部删除。

关于mysql - 从具有外键约束的表中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58893063/

相关文章:

asp.net - sql语句条件

MYSQL:如何将左连接结果拆分为多行

mysql - 外键-暂时绕过?

sql - 合并到不匹配时插入 if 条件

mysql - 如何在 ruby​​ 中使用 MySql

php - insert语句不将记录插入数据库

mysql - LEFT JOIN 查询 MYSQL 不工作

mysql - 最后排序空值

mysql - 使用嵌套聚合时临时表不存在错误

php - 从数据库中获取记录时逻辑不清晰