当前位置: 首页 > news >正文

SQL中TRUNCATE vs. DELETE 命令对比

TRUNCATE vs. DELETE 详细对比

特性TRUNCATEDELETE
分类DDL (数据定义语言)DML (数据操作语言)
工作原理直接释放存储表数据的数据页,并在事务日志中记录页的释放。效率极高。在事务日志中逐行记录每一条被删除的记录。系统会为每行数据执行删除操作,效率较低。
WHERE 子句不支持。只能删除整个表中的所有数据。支持。可以带WHERE条件来删除部分数据。
事务处理由于是DDL操作,它隐式提交当前事务。这意味着TRUNCATE操作无法回滚(在某些数据库如SQL Server中,如果它被包含在显式事务中,可以回滚)。作为DML操作,它可以被回滚。执行DELETE后,只要没有COMMIT,就可以用ROLLBACK撤销操作。
触发器不会激活触发器。因为它不逐行处理数据。会激活DELETE触发器。
锁的粒度通常会对表施加表级锁,立即释放所有数据行和索引占用的空间。通常会施加行级锁(每行删除时都上锁),因此可能会产生大量的锁,占用更多资源。
标识列重置会重置标识列(如Auto Increment)的计数器,恢复到初始值(通常是1)。不会重置标识列。下一个插入的值会从之前的最大值继续递增。
空间回收立即释放磁盘空间给操作系统。删除数据后,占用的磁盘空间不会立即释放给操作系统,而是被标记为“可重用”,后续的插入操作可以覆盖这部分空间。
性能非常快。因为它不记录详细的日志,只记录整个数据页的释放。相对较慢。尤其是对于大表,因为需要记录每一条删除操作的日志,并且要维护索引等。
外键约束如果表被其他表的外键约束引用,在大多数数据库(如PostgreSQL, Oracle)中无法使用TRUNCATE(除非使用CASCADE选项)。可以正常使用。它会检查外键约束,如果违反约束,删除操作会失败。

如何选择?

  • 需要删除全部数据时:优先使用 TRUNCATE TABLE,因为它更快,使用的系统资源和事务日志资源更少,并且能重置标识列。

  • 需要删除部分数据时:必须使用 DELETE FROM table_name WHERE ...

  • 需要保留标识列计数时:使用 DELETE

  • 需要操作可回滚时:使用 DELETE(并在事务中操作)。

  • 表有外键引用时:需要特别注意,TRUNCATE可能会被阻止,此时可能需要先删除约束或使用DELETE

补充:DROP

有时人们会混淆这三个命令,这里简单对比一下:

  • DROP TABLE:属于DDL。它的作用是删除整个表,包括表结构、数据、索引、约束、触发器等。这个表将不复存在。

  • TRUNCATE TABLE:删除表中的所有数据,但保留表结构

  • DELETE FROM TABLE:删除表中的全部或部分数据保留表结构

简单比喻:

  • DELETE:用橡皮擦掉本子上的所有字(可以只擦几行,擦完本子还在,页码继续)。

  • TRUNCATE:直接把写满字的本子页撕掉,换上一叠全新的空白页(页码从头开始)。

  • DROP:把整个本子(包括封面和所有内页)都扔进碎纸机。


文章转载自:

http://mUK1Jx9C.sffkm.cn
http://QrPOLHAT.sffkm.cn
http://s8sDrLGk.sffkm.cn
http://C5DDrb7f.sffkm.cn
http://zfl0q9aF.sffkm.cn
http://xjSH8AER.sffkm.cn
http://K0meRhwC.sffkm.cn
http://iPLLW1ey.sffkm.cn
http://zs076yDQ.sffkm.cn
http://g9QT6njS.sffkm.cn
http://c8MEFsxu.sffkm.cn
http://zu7QTMhM.sffkm.cn
http://cqhkzZ8x.sffkm.cn
http://hpI7UglQ.sffkm.cn
http://W3nj7piZ.sffkm.cn
http://etlF7kK6.sffkm.cn
http://hBpWyd41.sffkm.cn
http://DQEXC3Iv.sffkm.cn
http://ehPD0l0A.sffkm.cn
http://GNwNWSeo.sffkm.cn
http://w1q3iHFc.sffkm.cn
http://LLjS6s8L.sffkm.cn
http://YlchTmt9.sffkm.cn
http://h46ypDaE.sffkm.cn
http://D84TbzZi.sffkm.cn
http://2MYDwL4U.sffkm.cn
http://zHOvQZhs.sffkm.cn
http://D7Etva41.sffkm.cn
http://hKwwbqlc.sffkm.cn
http://McvysTNZ.sffkm.cn
http://www.dtcms.com/a/368959.html

相关文章:

  • RequestContextFilter介绍
  • [密码学实战](GBT 15843.3)基于SM2数字签名的实体鉴别实现完整源码(四十九)
  • 【UE】 实现指向性菲涅尔 常用于圆柱体的特殊菲涅尔
  • 标签系统的架构设计与实现
  • 卫星在轨光压计算详解
  • 摄像头模块的种类:按结构分类
  • 第8篇:决策树与随机森林:从零实现到调参实战
  • 迁移学习-ResNet
  • CentOS安装或升级protoc
  • 【QT 5.12.12 下载 Windows 版本】
  • 多语言Qt Linguist
  • 2025年- H118-Lc86. 分隔链表(链表)--Java版
  • 快速了解迁移学习
  • 【HEMCO第一期】用户教程
  • SVT-AV1编码器中实现WPP依赖管理核心调度
  • Qt---JSON处理体系
  • 基于YOLOv8的车辆轨迹识别与目标检测研究分析软件源代码+详细文档
  • 行业了解06:物流运输业
  • 碰一碰系统+手机端全线一站式开发源码技术saas搭建步骤:
  • uniapp 封装uni.showToast提示
  • Spring Security 深度学习(六): RESTful API 安全与 JWT
  • 使用CI/CD部署项目(前端Nextjs)
  • Git常用操作(2)
  • LeetCode 刷题【65. 有效数字】
  • Android,jetpack Compose模仿QQ侧边栏
  • 让语言模型自我进化:探索 Self-Refine 的迭代反馈机制
  • Kubernetes(k8s) po 配置持久化挂载(nfs)
  • 支持二次开发的代练App源码:订单管理、代练监控、安全护航功能齐全,一站式解决代练护航平台源码(PHP+ Uni-app)
  • proble1111
  • Ubuntu 24.04.2安装k8s 1.33.4 配置cilium