【MySQL】truncate、delete、drop的区别

本文详细对比了SQL中的truncate, delete与drop三种操作的特点与应用场景。truncate用于高效清空大表数据,但不可回滚;delete提供更灵活的数据行删除,并支持条件过滤与回滚;drop则彻底从数据库及系统层面删除表及其所有相关文件。

Truncate的特点

truncate table和delete from table_name;相似,但是truncate table是先drop table,然后在re-create table,如果要清空一个大表的所有数据行,truncate比delete高效;

  • Truncate是一个DDL操作,一旦执行会隐式提交,这就说明truncate无法rollback,所以执行之前需谨慎;

  • 如果表被锁住,truncate会报错;

  • 如果有外键约束,truncate也会报错;

  • 对于InnoDB/MyISAM表的auto_increment的列,truncate table之后可以重新使用序列值;

  • truncate table无法触发delete相关的触发器;

Delete的特点

  • Delete是DML操作,如果没有提交,可以rollback;

  • 对于InnoDB/MyISAM表的auto_increment的列,delete table之后可以无法重新使用序列值,但是重启之后可以重新使用序列;

  • Delete from table_name后面一定要跟where条件,否则会删除表的所有行;

Drop的特点

  • Drop table除了在数据库层面删除表,还会在系统层面删除xxx.ibd,xxx.frm(InnoDB表)或 xxx.MYD,xxx.MYI,xxx.frm (MyISAM)等文件;

  • drop table if exists table_name可以防止表不存在的报错,但是会有一个warning;

  • drop table也会隐式提交,除了临时表;

参考资料

https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html
https://dev.mysql.com/doc/refman/5.7/en/delete.html
https://dev.mysql.com/doc/refman/5.7/en/drop-table.html

原文链接:https://blog.51cto.com/darrenmemos/2288350

MySQL数据库操作中,DELETEDROPTRUNCATE是三个常用的数据删除命令,它们的区别如下: ### 功能差异 - DELETE:用于删除表中的特定行数据,可以指定条件删除,语法为 `DELETE FROM 表名 [WHERE 条件]`。例如,`DELETE FROM users WHERE age > 30;` 会删除 `users` 表中年龄大于30的所有行 [^2]。 - TRUNCATE:仅删除表中的所有数据,语法为 `TRUNCATE TABLE 表名`。例如,`TRUNCATE TABLE orders;` 会删除 `orders` 表中的所有数据,但保留表结构 [^2]。 - DROP:删除表及其所有数据,同时也会删除被依赖的约束、触发器、索引等,语法为 `DROP TABLE 表名`。例如,`DROP TABLE products;` 会彻底删除 `products` 表 [^2][^4]。 ### 删除后表索引所占空间的区别 - DELETE操作不会减少表或索引所占用的空间。因为DELETE只是标记要删除的行,表的物理空间不会被释放 [^4]。 - 当表被TRUNCATE后,这个表索引所占用的空间会恢复到初始大小 [^4]。 - DROP语句将表所占用的空间全释放掉 [^4]。 ### 删除速度 删除速度方面,DROP > TRUNCATE > DELETEDROP直接移除整个表结构,TRUNCATE只删除数据,而DELETE逐行删除数据,所以速度相对较慢 [^4]。 ### 应用范围 - DELETE可以用于表视图,只删除数据,不删除表的结构 [^4]。 - TRUNCATE只能对表操作,只删除数据,不删除表的结构 [^4]。 - DROP用于删除整个表(结构数据),同时也会删除被依赖的约束、触发器、索引等,但是依赖于该表的存储过程/函数将被保留,但其状态会变为invalid [^4]。 ### 语句类型 - DELETE语句为DML(Data Manipulation Language),这个操作会被放到rollback segment中,事务提交后才生效,如果有相应的trigger,执行的时候将被触发,可以通过rollback撤消操作。例如: ```sql START TRANSACTION; DELETE FROM users WHERE id = 1; -- 若想撤销操作 ROLLBACK; ``` - TRUNCATEDROP是DDL(Data Definition Language),操作立即生效,原数据不放到rollback segment中,不能回滚 [^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值