通過單一語句實現多表刪除
本文將解決如何在sql語句中通過單一語句實現多表刪除。
問題
有一張dish表,一個dish_flavor表和一個setmeal_dish表。需要刪除dishid為51和52的所有記錄。但是,使用以下sql語句時,并沒有刪除相應記錄:
delete dish, dish_flavor, setmeal_dish from dish, dish_flavor, setmeal_dish where dish.id = dish_flavor.id and dish.id = setmeal_dish.id and dish.id in (51, 52);
登錄后復制
原因
此語句本質上等價于:
delete dish, dish_flavor, setmeal_dish from dish join dish_flavor on dish.id = dish_flavor.id join setmeal_dish on dish.id = setmeal_dish.id where dish.id in ( 51, 52 );
登錄后復制
由于第三張表中沒有符合條件的數據,因此不會刪除任何記錄。內連接要求三張表中都必須存在該id的記錄,才會刪除該記錄。
解決方案
如果希望當有任何一張表中存在要刪除的id時就進行刪除,可以使用左連接:
DELETE dish, dish_flavor, setmeal_dish FROM dish LEFT JOIN dish_flavor ON dish.id = dish_flavor.id LEFT JOIN setmeal_dish ON dish.id = setmeal_dish.id WHERE dish.id IN ( 51, 52 );
登錄后復制
這樣,即使第三張表中沒有數據,前兩張表中的數據仍然會被刪除。