TRUNCATE TABLE、DELETE、commit、rollback

📅 2026/7/9 13:29:23
TRUNCATE TABLE、DELETE、commit、rollback
TRUNCATE 与 DELETE FROM 完整对比相同点不带WHERE的DELETE和TRUNCATE TABLE只删除表里所有数据表结构、字段、索引、约束完全保留不会删表。核心不同点维度DELETE FROM 表 (无WHERE)TRUNCATE TABLE 表SQL类型DML 数据操作语言DDL 数据定义语言事务支持支持关闭自动提交后可rollback不支持执行自动隐式commit无法回滚删除逻辑逐行删除记录undo日志直接清空数据页不逐行处理执行速度数据量大时很慢极快几乎瞬时完成触发器触发DELETE触发器完全不触发触发器自增主键自增值不变继续往下累加自增计数器重置为初始值1锁机制行锁/表锁并发影响小直接锁表瞬间独占TRUNCATETABLE比DELETE速度快且使用的系统和事务日志资源少 但是TRUNCATE无事务且不触发TRlGGER有可能造成事故 所以不建议在开发代码中使用此语句。 说明TRUNCATETABLE在功能上与不带WHERE子句的DELETE语句相同。 不带WHERE的DELETE和TRUNCATETABLE 只删除表里所有数据表结构、字段、索引、约束完全保留不会删表。commit、rollbackcommit提交数据一旦执行commit则数据就被永久的保存在数据库中了意味着数据不可回滚rollback回滚数据一旦执行rollback则可以实现数据的回滚回滚到最近一次commit之后对比TRUNCATE和deletefrom相同点都可以实现对表中所有数据的删除同时保留表结构 不同点TRUNCATEtable表名 一旦执行表数据全部清除同时不可回滚deletefrom表名 一旦执行表数据全被删除(不带where)同时数据可以被回滚------------------------------------1、DELETEFROM表DML 语句逐行删除数据每一行都会记录 undo 日志可回滚量大时极慢。TRUNCATE属于DDL 语句不逐行删直接清空数据页、重置自增计数器几乎不写日志性能差距巨大。2、TRUNCATE不触发触发器Trigger业务表如果有删除触发器日志记录、级联清理、数据备份用TRUNCATE会直接跳过触发器逻辑丢失审计、联动逻辑造成业务漏洞。 自带隐式提交不受事务控制TRUNCATE执行瞬间自动提交事务无法回滚线上误执行会直接丢数据。3.TRUNCATE和deletefrom功能只是 “看起来相同” 二者都清空全表、保留表结构但底层事务、日志、触发器、自增行为完全不一样不能等价看待。DMLINSERT、UPDATE、DELETE只有 DML 支持事务DDL 不支持。 DDLTRUNCATE只有 DML 支持事务DDL 不支持。----------------------------------------------------DDL 和 DML 的区别 DDL的操作一旦执行就不可回滚指令setautocommitfalse对DDL操作失败。 说一下 在执行DDL完操作之后mysql一定会执行一次commit而此commit操作是不受setautocommitfalse影响的。 DML的操作一旦执行也是不可回滚但是如果在执行DML之前 执行了setautocommitfalse则执行的DML操作可以被回滚。 DML操作默认情况下执行完后都会自动commit 如果希望执行完后不自动commit则使用setautocommitfalse即可。演示 delete from按顺序执行下面的sqlcommit # 首先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按顺序执行下面的sqlcommit 首先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