我有两张数据表。 我想删除两个表中的行。 但是他们之间有外键。 我怎么能这样做?
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)
答案 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'