TRUNCATE TABLE、DELETE、commit、rollback
2026/7/9 13:29:15 网站建设 项目流程

TRUNCATE 与 DELETE FROM 完整对比

相同点

不带WHERE的DELETETRUNCATE TABLE
只删除表里所有数据,表结构、字段、索引、约束完全保留,不会删表。

核心不同点

维度DELETE FROM 表 (无WHERE)TRUNCATE TABLE 表
SQL类型DML 数据操作语言DDL 数据定义语言
事务支持支持,关闭自动提交后可rollback不支持,执行自动隐式commit,无法回滚
删除逻辑逐行删除,记录undo日志直接清空数据页,不逐行处理
执行速度数据量大时很慢极快,几乎瞬时完成
触发器触发DELETE触发器完全不触发触发器
自增主键自增值不变,继续往下累加自增计数器重置为初始值1
锁机制行锁/表锁,并发影响小直接锁表,瞬间独占



TRUNCATETABLEDELETE速度快,且使用的系统和事务日志资源少, 但是,TRUNCATE无事务且不触发TRlGGER,有可能造成事故, 所以,不建议在开发代码中使用此语句。 说明:TRUNCATETABLE在功能上,与不带WHERE子句的DELETE语句相同。 不带WHEREDELETETRUNCATETABLE: 只删除表里所有数据,表结构、字段、索引、约束完全保留,不会删表。

commit、rollback

commit:提交数据,一旦执行commit,则数据就被永久的保存在数据库中了,意味着,数据不可回滚rollback:回滚数据,一旦执行rollback,则可以实现数据的回滚,回滚到最近一次commit之后
对比TRUNCATEdeletefrom相同点:都可以实现,对表中所有数据的删除,同时保留表结构 不同点:TRUNCATEtable表名 一旦执行,表数据全部清除,同时,不可回滚deletefrom表名 一旦执行,表数据全被删除(不带where),同时,数据可以被回滚------------------------------------1DELETEFROM表:DML 语句,逐行删除数据,每一行都会记录 undo 日志,可回滚;量大时极慢。TRUNCATE:属于DDL 语句,不逐行删,直接清空数据页、重置自增计数器,几乎不写日志,性能差距巨大。2TRUNCATE不触发触发器Trigger业务表如果有删除触发器(日志记录、级联清理、数据备份),用TRUNCATE会直接跳过触发器逻辑,丢失审计、联动逻辑,造成业务漏洞。 自带隐式提交,不受事务控制TRUNCATE执行瞬间自动提交事务,无法回滚;线上误执行会直接丢数据。3.TRUNCATEdeletefrom,功能只是 “看起来相同” 二者都清空全表、保留表结构,但底层事务、日志、触发器、自增行为完全不一样,不能等价看待。
DML:INSERTUPDATEDELETE只有 DML 支持事务;DDL 不支持。 DDL:TRUNCATE只有 DML 支持事务;DDL 不支持。----------------------------------------------------DDL 和 DML 的区别 DDL的操作,一旦执行,就不可回滚,指令setautocommit=false对DDL操作失败。 说一下: 在执行DDL完操作之后,mysql一定会执行一次commit,而此commit操作是不受setautocommit=false影响的。 DML的操作,一旦执行,也是不可回滚,但是,如果在执行DML之前, 执行了setautocommit=false,则执行的DML操作,可以被回滚。 DML操作,默认情况下,执行完后都会自动commit, 如果希望执行完后,不自动commit,则使用setautocommit=false即可。

演示 delete from(按顺序执行下面的sql)

commit # 首先,commit一下 SELECT * FROM n_emp2 # 查一下,是有数据的 SET autocommit = FALSE DELETE FROM n_emp2 # 删除 n_emp2 表的全部数据 SELECT * FROM n_emp2 # 查一下,表中一行数据也没了 ROLLBACK # 回滚一下,就回滚到 执行 commit 之后的状态了 SELECT * FROM n_emp2

演示 TRUNCATE(按顺序执行下面的sql)

commit "首先,commit一下" SELECT * FROM n_emp2 "查一下,是有数据的" SET autocommit = FALSE TRUNCATE TABLE n_emp2 "清空 n_emp2 表的全部数据" /* 其实,执行完 TRUNCATE TABLE 表名 后,mysql自己执行了一次commit, 所以,下面执行回滚时候,数据没有被回滚回来。 */ SELECT * FROM n_emp2 "查一下,表中一行数据也没了" ROLLBACK "回滚一下,数据也没有被回滚回来哦!!!" SELECT * FROM n_emp2

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询