如何在SQL中通过单一语句实现多表删除?

新手上路,请多包涵

请问我要实现一个多表删除的功能,通过dishID删除下面三张表中的相关记录,我下面的SQL问题在哪呢?
虽然我可以通过程序的逻辑解决这个问题,但是那样的话不够简洁,而且我相信一条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);

执行结果:

Your call!
Query OK, 0 rows affected
Time: 0.002s

第三张表是空的,但是前两张表中的数据没有删除。

我做过的尝试:

1. 网上查询资料
2. chatgpt

希望获得的结果:

1. 知道我的sql问题在哪
2. 如何改正
3. 好的sql学习资源
阅读 1.1k
1 个回答

你的语句本质上等价于:

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 );

这样就算第三张表没有数据,前两张表内的数据还是会被删除

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏