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

时间:2016-09-29 11:27:05

标签: mysql

我有两张数据表。 我想删除两个表中的行。 但是他们之间有外键。 我怎么能这样做?

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

 departure_time
     id    departure_id (fk)
      1         1
      2         2

最好的办法是让查询获取所有要删除的行,并同时删除两个表中的行。 有没有办法在不删除约束/ FK的情况下执行此操作?

在这个例子中,假设我想删除所有离开日期2016-09-30

(删除出发:id 2和departure_time:id:2)

3 个答案:

答案 0 :(得分:5)

在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。然后,当您删除原始表中的行时,数据库将删除第二个表中的相关记录。

答案 1 :(得分:5)

请试试这个,希望它会有所帮助。

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自动为您工作。

答案 2 :(得分:0)

对我来说,多行删除失败了,因为第二个表中有多个行引用了第一个表。我也无法更新架构以添加外键约束(如其他答案所示)。

像这样使用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'