Notepad++ Markdown预览终极指南:如何在编辑器内实时渲染文档
2026/7/9 14:30:38
不带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:提交数据,一旦执行commit,则数据就被永久的保存在数据库中了,意味着,数据不可回滚rollback:回滚数据,一旦执行rollback,则可以实现数据的回滚,回滚到最近一次commit之后对比TRUNCATE和deletefrom相同点:都可以实现,对表中所有数据的删除,同时保留表结构 不同点:TRUNCATEtable表名 一旦执行,表数据全部清除,同时,不可回滚deletefrom表名 一旦执行,表数据全被删除(不带where),同时,数据可以被回滚------------------------------------1、DELETEFROM表:DML 语句,逐行删除数据,每一行都会记录 undo 日志,可回滚;量大时极慢。TRUNCATE:属于DDL 语句,不逐行删,直接清空数据页、重置自增计数器,几乎不写日志,性能差距巨大。2、TRUNCATE不触发触发器Trigger业务表如果有删除触发器(日志记录、级联清理、数据备份),用TRUNCATE会直接跳过触发器逻辑,丢失审计、联动逻辑,造成业务漏洞。 自带隐式提交,不受事务控制TRUNCATE执行瞬间自动提交事务,无法回滚;线上误执行会直接丢数据。3.TRUNCATE和deletefrom,功能只是 “看起来相同” 二者都清空全表、保留表结构,但底层事务、日志、触发器、自增行为完全不一样,不能等价看待。DML:INSERT、UPDATE、DELETE只有 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即可。commit # 首先,commit一下 SELECT * FROM n_emp2 # 查一下,是有数据的 SET autocommit = FALSE DELETE FROM n_emp2 # 删除 n_emp2 表的全部数据 SELECT * FROM n_emp2 # 查一下,表中一行数据也没了 ROLLBACK # 回滚一下,就回滚到 执行 commit 之后的状态了 SELECT * FROM n_emp2commit "首先,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