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

作者站长头像
站长
· 阅读数 30

请问我要实现一个多表删除的功能,通过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个回答
avatar
test
2024-08-12

你的语句本质上等价于:

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

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

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容