MySQL中DROP,TRUNCATE 和DELETE的区别

本文详细比较了SQL中的DELETE、TRUNCATE及DROP语句的区别。包括它们对数据与表结构的影响、执行速度、是否支持回滚及触发触发器等特性。
注意:这里说的delete是指不带where子句的delete语句


相同点:
truncate和不带where子句的delete, 以及drop都会删除表内的数据

不同点:
1. truncate和 delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.

2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.

3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).

4.速度,一般来说: drop> truncate > delete

5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及.
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据/
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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值