搜尋

首頁  >  問答  >  主體

在一個語句中從多個表中刪除

<p>使用MySQL,我試著一次從多個表中刪除多筆記錄。 最初我認為可以這樣做:</p> <pre class="brush:php;toolbar:false;">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 (?,?,?,?);</pre> <p>然而,如果table2中沒有現有的記錄,我應該將<strong>JOIN</strong>改為<strong>LEFT JOIN</strong>嗎?此外,如果我只刪除八個表中的兩三筆記錄(2x2x2x2x2x2x2x2),這樣做會導致延遲嗎? </p>
P粉716228245P粉716228245462 天前528

全部回覆(1)我來回復

  • P粉118698740

    P粉1186987402023-08-19 00:06:31

    是的,將table2上的連線改為left join會實現您想要的效果。屬於清單和table3table1中的行都會被刪除,無論它們是否也存在於table2中。同時,可能的匹配行也將被刪除。

    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 (?, ?, ?, ?);

    我建議將table3上的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)

    回覆
    0
  • 取消回覆