mysql 中 TRUNCATE 、DROP 、DELETE

本文详细对比了SQL中的TRUNCATE, DELETE和DROP命令,阐述了它们在数据删除、表结构保留、事务支持及执行效率等方面的区别。TRUNCATE作为DDL命令,快速清空表数据但不支持回滚;DELETE为DML命令,支持条件删除和事务回滚;DROP则彻底删除表结构,无法恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用

https://stackoverflow.com/questions/20559893/comparison-of-truncate-vs-delete-in-mysql-sqlserver
https://www.c-sharpcorner.com/blogs/difference-between-truncate-delete-and-drop-in-sql-server1

三个操作均为危险操作 , 正式环境请务必先备份数据 。


TRUNCATE

  1. TRUNCATE 是一个 DDL 命令。
  2. TRUNCATE 使用表锁,在删除所有记录时,整张表被锁定。
  3. 不能和 where 语句一起使用。
  4. TRUNCATE 会移除表中所有数据,但是不会删除表结构。
  5. TRUNCATE 不会激活触发器,因为该操作不记录单个行删除操作。
  6. 不支持回滚。

DELETE

  1. DELETE 是一个 DML 命令
  2. DELETE语句使用行锁执行,表中的每一行都被锁定以进行删除。
  3. 可以和 where 语句一起使用
  4. 删除操作可以激活触发器,因此操作日志是单独记录。
  5. 支持回滚。

DROP

  1. DROP 是一个 DDL 命令。
  2. DROP 会移除表中所有的行、索引、权限。
  3. 不会触发任何DML触发器。
  4. 不支持回滚。
  5. 不能和 where 语句一起使用。

执行效率

这一点有待验证 : 执行效率 DROP > TRUNCATE > DELETE 。


扩展

TRUNCATE和 不带 where 子句的DELETE、以及 DROP 都会删除表内所有的数据 。如果主键自增 , DELETE 会保留主键计数。

举例 : 如有一张 student 表 , 表中主键 id 为自增 ,现在已经有三个学生数据, id 分表为 1、2、3 , 现在想要删除 student 表

delete  from  student ;   // 删除表中所有数据 , 保留表结构 , 下次插入数据, id 从 4 开始 。
show  tables ;   //  student  表存在 。
truncate   table  student ;   // 删除表中所有数据 , 保留表结构 , 下次插入数据, id 从 1 开始  。
show  tables ;   //  student  表存在 。
drop table  student ;   //  删除表中所有数据 , 删除表结构 。
show  tables ;   //  student  表不存在 。

关于回滚

BEGIN;
delete from  student;  //支持回滚
ROLLBACK;  //表中数据仍存在

BEGIN;
truncate table student ;  // 不支持回滚
ROLLBACK;  // 表中所有数据被删除,表结构保留

BEGIN;
DROP table student ;  // 不支持回滚
ROLLBACK;   // 表中所有行、索引、权限都被删除

如果既想用 truncate 又想使用事务

可以用以下代码代替 truncate , 下列代码支持回滚 :

CREATE TABLE t_test_new LIKE t_test
RENAME TABLE t_test TO t_test_old, t_test_new TO t_test
DROP TABLE t_test_old
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值