使用mysql我试图一次从多个表中删除多个记录。一开始我想做的是:
DELETE t1, t2 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.table1_id JOIN table3 t3 ON t1.id = t3.table1_id WHERE t1.id IN (?,?,?,?);
但是,如果表2中没有现有记录,我会将连接更改为左连接吗?另外,如果我只删除八个表中的两个或三个记录(2x2),这样做会导致延迟吗?
qnakjoqk1#
是,更改上的联接 table2 至 left join 会做你想做的事。中的行 table1 属于名单和 table3 将全部删除,无论它们是否也存在于 table2 . 同时,在 table2 也将被删除。
table2
left join
table1
table3
delete t1, t2 from table1 t1 left join table2 t2 on t1.id = t2.table1_id inner join table3 t3 on t1.id = t3.table1_id where t1.id in (?, ?, ?, ?);
我建议重写 join 在 table3 到一个 exists 而不是条件。这使得查询的意图更加明显,并且可能会执行得更好,特别是当您在上有索引时 table3(table1_id) :
join
exists
table3(table1_id)
delete t1, t2 from table1 t1 left join table2 t2 on t1.id = t2.table1_id where t1.id in (?, ?, ?, ?) and exists (select 1 from table3 t3 where t3.table1_id = t1.id)
1条答案
按热度按时间qnakjoqk1#
是,更改上的联接
table2
至left join
会做你想做的事。中的行table1
属于名单和table3
将全部删除,无论它们是否也存在于table2
. 同时,在table2
也将被删除。我建议重写
join
在table3
到一个exists
而不是条件。这使得查询的意图更加明显,并且可能会执行得更好,特别是当您在上有索引时table3(table1_id)
: