请问TRUNCATE TABLE 与 DELETE在删除整个表的所有记录时的区别

本文详细比较了SQL中的DELETE与TRUNCATE两种操作的区别,包括执行速度、是否可回滚、对表结构的影响等方面,并解释了高水位线的概念及其对数据库性能的影响。
1.DELETE
 ・DML语言
 ・可以回退
 ・可以有条件的删除

     DELETE FROM 表名
   WHERE 条件

2.TRUNCATE TABLE
 ・DDL语言
 ・无法回退
 ・默认所有的表内容都删除
 ・删除速度比delete快。

   TRUNCATE TABLE 表名



1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销,
而TRUNCATE则不会被撤销。 
2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,
不能对TRUNCATE使用ROLLBACK命令。 
3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,
经过TRUNCATE操作后的表比Delete操作后的表要快得多。 
4、TRUNCATE不能触发任何Delete触发器。 
5、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。 
6、不能清空父表。

在oracle里,使用delete删除数据以后,数据库的存储容量不会减少,而且使用delete删除某个表的数据
以后,查询这张表的速度和删除之前一样,不会发生变化。

因为oralce有一个HWM高水位,它是oracle的一个表使用空间最高水位线。当插入了数据以后,高水位线
就会上涨,但是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,
还是你刚才删除数据以前那么高的水位。除非使用truncate删除数据。那么,这条高水位线在日常的增
删操作中只会上涨,不会下跌,所以数据库容量也只会上升,不会下降。而使用select语句查询数据时,
数据库会扫描高水位线以下的数据块,因为高水位线没有变化,所以扫描的时间不会减少,所以才会出
现使用delete删除数据以后,查询的速度还是和delete以前一样。
在 MySQL 中,`TRUNCATE TABLE` `DELETE FROM` 都用于删除中的数据,但它们在多个方面存在区别: - **语法**:`TRUNCATE TABLE` 的语法为 `TRUNCATE TABLE table_name`;`DELETE FROM` 的语法为 `DELETE FROM table_name [WHERE]` [^1]。 - **删除方式**:`TRUNCATE TABLE` 是删除并重建;`DELETE FROM` 是逐行删除 [^1]。 - **速度**:`TRUNCATE TABLE` 更快,因为它直接删除整个数据块,而不是逐行删除;`DELETE FROM` 较慢,因为它需要逐行处理 [^1][^3][^4]。 - **事务支持**:`TRUNCATE TABLE` 不能回滚,会隐式提交;`DELETE FROM` 可以回滚 [^1]。 - **触发器**:`TRUNCATE TABLE` 不触发触发器;`DELETE FROM` 会触发触发器 [^1]。 - **自增值重置**:`TRUNCATE TABLE` 会重置自增值;`DELETE FROM` 不会重置自增值 [^1]。 - **WHERE 条件**:`TRUNCATE TABLE` 不支持 `WHERE` 条件,只能删除全量数据;`DELETE FROM` 支持 `WHERE` 条件,可以选择要删除记录 [^1][^3]。 - **锁机制**:`TRUNCATE TABLE` 使用级锁;`DELETE FROM` 使用行级锁 [^1]。 - **空间释放**:`TRUNCATE TABLE` 立即释放空间;`DELETE FROM` 不立即释放空间 [^1]。 - **权限要求**:`TRUNCATE TABLE` 需要 `DROP` 权限;`DELETE FROM` 需要 `DELETE` 权限 [^1]。 - **外键关联情况**:有外键关联,若外键指定级联删除,`TRUNCATE TABLE` 会删除关联的子的所有数据;若外键未指定级联,`TRUNCATE TABLE` 逐行删除数据,当存在父行关联子数据,将会报错 [^5]。 ### 使用场景 - **TRUNCATE TABLE**:当需要快速删除中的所有数据,且不需要保留自增值、不需要回滚操作、不需要触发触发器,可以使用 `TRUNCATE TABLE`。例如,在测试环境中,每次测试前清空数据。 - **DELETE FROM**:当需要根据特定条件删除部分数据,或者需要回滚删除操作,或者删除操作需要触发触发器,应使用 `DELETE FROM`。例如,删除用户中某个特定用户的记录。 ### 原理 - **TRUNCATE TABLE**:其原理是直接删除并重建,它不会逐行扫描删除数据,而是直接释放存储数据数据块,因此速度较快。它会隐式提交事务,无法回滚操作。由于是重建,自增值会被重置。并且因为没有逐行操作,所以不会触发触发器 [^1][^4]。 - **DELETE FROM**:它是逐行扫描,根据 `WHERE` 条件(如果有)确定要删除的行,然后逐行删除。每删除一行,都会记录事务日志,所以可以进行回滚操作。由于是逐行操作,会触发相应的触发器。删除操作不会重置自增值,也不会立即释放占用的空间 [^1][^3]。 ### 代码示例 ```sql -- TRUNCATE TABLE 示例 TRUNCATE TABLE users; -- DELETE FROM 示例 DELETE FROM users WHERE user_id = 1; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值