如何使用 SQL 单语句从多张表中删除数据,即使其中一张表没有匹配项?

有一天,我在图书馆翻一本关于数据库管理的书,突然遇到一个案例:小张因为餐厅决定重新推出一些新菜品,想要删除一份有关菜品的菜单。
这就是问题所在。
菜单中的菜品信息分布在三个表中,删除时任何表的数据都不能漏掉。
我看着那行代码,想知道这不是 LEFT JOIN 的用武之地吗?
小张的餐厅位于市中心,每天接待数百名顾客。
为了不影响餐厅的正常营业,应在非高峰时段进行删除。
我仔细研究了LEFT JOIN的使用,发现即使右表没有匹配,它也能保留左表的记录,从而保证两个表都不会遗漏任何数据。

我记得书上提到的例子: DELETE from duck、dish_flavor、drop setmeal_dish from duck JOIN duck_flavor ondies.id=dish_flavor.dish_id JOIN setmeal_dishondish.id DROP=setmeal_dish.dish_id WHEREdish.id(5 1 , 5 2 )。

小张的餐厅里,菜品ID是5 1 和5 2 ,这两个ID分别关联了三个表的数据。
我计算了一下,发现如果使用INNER JOIN的话,可能需要写3 条删除语句,但是这个操作效率很低。
因此,我建议小张使用LEFT JOIN。

实施后发现,小张的餐厅删除菜品信息时,数据的一致性和完整性得到了很好的保证。
等等,我突然想到如果餐厅其他系统也依赖于这些数据,因此在删除它之前应该进行充分的测试和备份。

就这样,我学会了如何在复杂的数据删除操作中使用LEFT JOIN,同时也提醒自己,每一次数据库操作都要小心谨慎。

sql 怎么同时删除多个表中的全部数据,而不删除表结构,不要用多条delete语句

坦白讲,TRUNCATE比DELETE效率更高,但是使用时需要注意权限和备份。
详细来说,TRUNCATE 直接物理删除数据文件,而不使用事务日志。
所以去年我们做千万级数据的表清理时,TRUNCATE比DELETE至少快3 倍,而且CPU和I/O占用还不到DELETE的1 /1 0还有一点是TRUNCATE会重置自增ID。
很多人不重视它。
例如,如果你使用触发器依赖ID,它可能会爆炸。
还有另一个关键细节。
TRUNCATE不支持WHERE条件,所以如果你只想删除一些数据,你应该使用DELETE。
对于小于3 000的表使用DELETE问题不大。
一开始我以为TRUNCATE比较危险,后来发现只要权限管理正确,并且保留备份,速度上的优势绝对是值得的。
等等,还有一件事。
TRUNCATE 不是 DML 语句。
没有日志记录。
如果您犯了错误,则无法挽回。
很多人都没有注意到。
建议新手先在测试环境下对比。
这一点值得一试,但在生产中不要盲目操作。

SQL 语句删除问题同时删除两个表内关联的数据

上周,我的一个朋友询问了 SQL 删除操作。
他说不可能在一个SQL语句中执行两个删除操作。
我告诉他有两种方法可以实现这个功能。

第一种方法是使用删除外键关联。
可以在B表的uid字段上设置一个外键,将其与A表的ID字段关联起来。
这样,当A表中的一条记录被删除时,B表中与这些ID关联的记录也会被自动删除。

第二种方法是使用存储过程并将其与事务结合起来。
您可以创建一个执行第一个删除操作并提交事务的存储过程。
然后执行第二次删除操作并再次提交事务。

截至2 02 3 年,我认为这两种方法各有优缺点。
删除外键关联比较简单,但是会影响B表数据的完整性。
存储过程和事务的结合更加灵活,但是实现起来稍微复杂一些。

一位朋友听了我的建议,决定根据实际情况选择合适的方法。
他说,由你来决定哪种方法更合适。
算了,其实他心里已经有了答案。