【问题标题】:How do I delete a record in a table which has a primary key referenced in another table as foreign key?如何删除表中的记录,该表中的主键在另一个表中作为外键引用?
【发布时间】:2020-01-15 18:32:05
【问题描述】:

在我的数据库中,我有一个表“employee”,它有一个主键属性“employee_id”和另一个属性“salary”。 还有另一个表说“employee_qualification”,它有一个外键属性“employee_id”。 那么,如何删除“employee”和“employee_qualifications”中薪水=10000 的所有记录?

这似乎不起作用。

DELETE FROM employee WHERE employee.salary=10000;

【问题讨论】:

  • 使用ON DELETE CASCADE 配置架构(例如)或首先手动删除相关记录。 (我更喜欢后者,尽管它可能看起来更多的工作:它也更受控制和明确。)
  • 我在某个地方的 google 上看到了ON DELETE CASCADE,但是这到底要写在哪里?
  • 见上面的链接——它是用来配置依赖表的外键定义的。

标签: mysql sql database


【解决方案1】:

MySQL 允许同时从多个表中删除。所以你可以这样做:

DELETE e, eq
    FROM employee e JOIN
         employee_qualitifications eq
    WHERE e.employee_id = eq.employee_id AND
          e.salary = 10000;

【讨论】:

  • 这很漂亮。它是否也意味着一个 [隐式] 交易?
  • @user2864740 。 . .这可能取决于所使用的存储引擎。 InnoDB 在单个事务中执行删除,我希望多表删除也是如此。
【解决方案2】:

您可以执行两条语句。

DELETE FROM employee_qualifications WHERE employee_qualifications.employee_id in (SELECT employee_id FROM employee WHERE employee.salary=10000)
DELETE FROM employee WHERE employee.salary=10000

虽然这可行,但它可能会在employee_qualifications 表中留下一些孤立记录。下面的选项将清除孤立的记录。

DELETE FROM employee WHERE employee.salary=10000
DELETE FROM employee_qualifications WHERE employee_qualifications.employee_id Not in (SELECT employee_id FROM employee)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2018-05-24
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多