通過單一語句實現(xiàn)跨多表刪除
問題:
如何通過一條 sql 語句實現(xiàn)從多個表中刪除相關(guān)記錄?
示例:
假設(shè)有以下三個表:
- dish
- dish_flavor
- setmeal_dish
需要使用一條 sql 語句刪除 dishid 為 51 和 52 的記錄及其在 dish_flavor 和 setmeal_dish 表中的相關(guān)記錄。
嘗試的 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);
登錄后復(fù)制
執(zhí)行結(jié)果:
第三張表為空,但前兩張表中的數(shù)據(jù)未刪除。
分析:
原始 sql 語句使用內(nèi)連接從三張表中查找符合條件的記錄。然而,由于第三張表沒有符合條件的數(shù)據(jù),因此內(nèi)連接篩選出的記錄數(shù)為零,導(dǎo)致前兩張表中的數(shù)據(jù)也無法刪除。
解決方案:
要解決這個問題,可以使用左連接。左連接保證了即使在第三張表中沒有找到匹配的記錄,也可以刪除與前兩張表中符合條件的 id 關(guān)聯(lián)的記錄。
修改后的 sql 語句:
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ù)制
使用左連接后,只要前兩張表中有匹配的 id,無論第三張表中是否存在記錄,都會刪除記錄。