Mysql: 删除带有外键的两个表中的行

7

我有两个具有数据的表格。 我想在这两个表格中删除行。 但是它们之间存在外键。 我该如何做呢?

 departure
     id    departure_date
      1        2016-09-29
      2        2016-09-30

 departure_time
     id    departure_id (fk)
      1         1
      2         2

最好的做法是编写一个查询以获取所有要删除的行,并同时在两个表中删除这些行。 有没有不需要删除约束/外键的方法?
例如,在此示例中,假设我想删除所有从2016-09-30日期开始的出发。
(删除出发:id 2和departure_time:id:2)
3个回答

12
请尝试此方法,希望能有所帮助。
DELETE FROM departure, departure_time
USING departure
INNER JOIN departure_time
WHERE departure_date = '2016-09-30'
      AND departure_time.id = departure.id

或者

DELETE FROM departure, departure_time
USING departure
INNER JOIN departure_time
WHERE departure_date = '2016-09-30'
      AND departure_time.departure_id = departure.id

或者您可以使用ON DELETE CASCADE,这将自动为您完成工作。


1
嗨Mumesh,我错了还是你写的两个查询是相同的?谢谢你确认并指出区别。 - Robert
他正在使用两个不同的列 iddeparture_id,尽管只有 departure_id 是正确的。 - Manatax
通过PHPMYADMIN轻松完成此操作,参见https://dev59.com/b3I_5IYBdhLWcg3wAeA2#32244787。该答案适用于Oracle,但也适用于MySQL。 - Sablefoste

8
在MySQL中,您也可以在一条语句中从多个表中删除:
delete d, dt
    from departure d join
         departure_time dt
         on d.id = dt.departure_id
    where departure_date = '2016-09-30';

另一个解决方案是将外键关系声明为on delete cascade。然后,当您删除原始表中的行时,数据库将删除第二个表中的相关记录。


4
感谢您的回复。但是这并没有起作用。 必须将 "dt.id" 更改为 "dt.departure_id",然后出现了一个错误: 无法删除或更新父行:外键约束失败(osl.departure_time,CONSTRAINT departure_time_departure_fk FOREIGN KEY (departure_id) REFERENCES departure (id))。 - TorK

1
多行删除失败,因为第二个表中有多行引用第一个表。我也无法更新模式以添加外键约束(如其他答案所建议的)。
像这样使用IN就可以:
DELETE FROM departure_time
WHERE departure_id IN (
        SELECT departure_id
        FROM departure
        WHERE departure_date = '2016-09-30'
    );
DELETE from departure
WHERE departure_date = '2016-09-30'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接