通過單一語句實現(xiàn)多表刪除
本文將解決如何在sql語句中通過單一語句實現(xiàn)多表刪除。
問題
有一張dish表,一個dish_flavor表和一個setmeal_dish表。需要刪除dishid為51和52的所有記錄。但是,使用以下sql語句時,并沒有刪除相應(yīng)記錄:
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);
登錄后復(fù)制
原因
此語句本質(zhì)上等價于:
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 );
登錄后復(fù)制
由于第三張表中沒有符合條件的數(shù)據(jù),因此不會刪除任何記錄。內(nèi)連接要求三張表中都必須存在該id的記錄,才會刪除該記錄。
解決方案
如果希望當(dāng)有任何一張表中存在要刪除的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 );
登錄后復(fù)制
這樣,即使第三張表中沒有數(shù)據(jù),前兩張表中的數(shù)據(jù)仍然會被刪除。