Truncate Table

本文详细解释了SQL中的TRUNCATE TABLE语句的用法、原理及与DELETE、DROP的区别,包括速度、安全性、权限和示例。

Truncate是SQL中的一个删除数据表内容的语句。

  语法 :  TRUNCATE TABLE name

  参数 :  name 是要截断的表的名称或要删除其全部行的表的名称。

  

下面是对Truncate语句在MSSQLServer2000中用法和原理的说明:

  Truncate table 表名 执行的速度快,并且效率高。 因为TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同 ——二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

  DELETE 语句每次只删除一行,并在事务日志中为所删除的每行记录一项信息。而TRUNCATE TABLE 是通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
  TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

  

对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

  TRUNCATE TABLE 不能用于参与了索引视图的表。
  对用TRUNCATE TABLE删除数据的表上增加数据时,要使用UPDATE STATISTICS来维护索引信息。
  如果有ROLLBACK语句,DELETE操作将被撤销,但TRUNCATE不会撤销。

  

示例:

  1、删除 authors 表中的所有数据。
  TRUNCATE TABLE authors
  权限
  TRUNCATE TABLE 权限默认授予表所有者、sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员且不可转让。
  补充参数:
  TRUNCATE TABLE name [DROP/REUSE STORAGE]
  DROP STORAGE:显式指明释放数据表和索引的空间
  REUSE STORAGE:显式指明不释放数据表和索引的空间
  truncate命令是会把自增的字段还原为从1开始的,或者你试试把table_a清空,然后取消自增,保存,再加回自增,这也是自增段还原为1 的方法。
truncate,delete,drop的异同点总结:
相同点: 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,再重新导入/插入数据

<think>我们正在讨论数据库中的TRUNCATE TABLE操作。根据引用[1],TRUNCATE TABLE是MySQL中用于快速删除中所有数据的一个命令。与DELETE命令相比,它具有性能优势和一些独特的特点。 接下来,我将详细解释TRUNCATE TABLE命令,包括其用法、工作原理、注意事项,并生成相关问题。 一、TRUNCATE TABLE命令基础 TRUNCATE TABLE命令用于删除中的所有行,但保留的结构(包括列定义、索引、约束等)。其基本语法如下: ```sql TRUNCATE [TABLE] table_name; ``` 其中,`TABLE`关键字是可选的。 二、TRUNCATE TABLE与DELETE的区别 1. **操作方式**: - `DELETE`:逐行删除记录,并在事务日志中记录每个删除操作,因此可以回滚。 - `TRUNCATE TABLE`:通过释放存储数据的数据页来删除数据,并在事务日志中只记录页的释放,因此效率更高。 2. **事务日志**: - `DELETE`:记录详细的删除日志,因此恢复时可以根据日志逐行恢复。 - `TRUNCATE TABLE`:只记录整个数据页的释放操作,日志量小。 3. **事务支持**: - `DELETE`:删除操作可以被包含在事务中,可以回滚。 - `TRUNCATE TABLE`:在大多数数据库系统中(如MySQL的InnoDB引擎),TRUNCATE操作也可以回滚(但注意,在SQL Server中,如果使用事务TRUNCATE也可以回滚;但在MySQL中,TRUNCATE操作是DDL,会隐式提交当前事务,因此能回滚,除非在支持DDL事务数据库引擎中)。 注意:在MySQL中,TRUNCATE TABLE对于InnoDB,实际上会创建一个新的(包括新的空间),然后删除旧,因此它能回滚(因为DDL操作会隐式提交事务)。但是,对于MyISAMTRUNCATE TABLE操作也是通过删除文件并重建结构实现的,同样能回滚。 4. **重置自增列**: - 使用`TRUNCATE TABLE`后,自增列(AUTO_INCREMENT)会被重置为初始值(通常从1开始)。 - 使用`DELETE`删除所有行后,自增列会重置,会继续从删除前的最大值加1开始。 三、TRUNCATE TABLE的工作原理 在MySQL中,对于InnoDBTRUNCATE TABLE操作实际上是: 1. 创建一个新的(具有相同的结构)。 2. 删除原始。 3. 将新重命为原始。 因此,它实际上是一个DDL(数据定义语言)操作,而是DML(数据操作语言)操作。 四、使用注意事项 1. **权限**:执行TRUNCATE TABLE需要具有的DROP权限(因为实际上是删除并重建)。 2. **外键约束**:如果被其他的外键引用,则使用TRUNCATE TABLE(因为会破坏引用完整性)。在这种情况下,需要先删除外键约束,或者使用DELETE。 3. **触发器**:TRUNCATE TABLE会触发DELETE触发器(因为它是DDL操作,而DELETE是DML)。 4. **事务**:在MySQL中,TRUNCATE TABLE会隐式提交当前事务(因为它是DDL),所以能回滚(除非在支持DDL事务数据库中,但MySQL目前支持)。 5. **性能**:对于大TRUNCATE TABLE通常比DELETE快得多,因为它逐行删除,也记录每一行删除的日志。 五、示例 假设有一个为`employees`的,要清空该: ```sql TRUNCATE TABLE employees; ``` 六、总结 TRUNCATE TABLE是一个高效删除中所有数据的命令,但使用时需注意其与DELETE的区别,特别是在事务、外键和自增列方面的特性。 下面生成相关问题: §§相关问题§§ 1. TRUNCATE TABLE和DELETE在性能上具体有多大差异? 2. 在MySQL中,如果有外键约束,如何安全地清空数据? 3. TRUNCATE TABLE操作会重置自增列,那么如何在重置自增列的情况下清空? 4. TRUNCATE TABLE操作是否会导致数据库的锁?如果是,是什么级别的锁? 5. 在哪些场景下应该避免使用TRUNCATE TABLE?</think>### TRUNCATE TABLE 命令详解 `TRUNCATE TABLE` 是 SQL 中用于快速清空数据的 DDL(数据定义语言)命令,其核心特点和用法如下: #### 一、基本语法 ```sql TRUNCATE TABLE table_name; ``` 示例:清空 `employees` ```sql TRUNCATE TABLE employees; ``` #### 二、核心特性 1. **高效删除** - 直接释放数据页(而非逐行删除),操作速度远快于 `DELETE`[^1]。 - 事务日志仅记录页释放操作,日志量极小。 2. **自增列重置** - 自动将自增计数器(如 `AUTO_INCREMENT`)归零,下次插入从初始值开始。 3. **DDL 操作性质** - 隐式提交当前事务可回滚)。 - 需要 `DROP` 权限(而非 `DELETE` 权限)。 #### 三、与 DELETE 的关键区别 | 特性 | TRUNCATE TABLE | DELETE | |--------------------|-------------------------|--------------------------| | **操作类型** | DDL | DML | | **执行速度** | 极快(毫秒级) | 较慢(逐行删除) | | **事务日志** | 记录页释放 | 记录每行删除 | | **自增列** | 重置归零 | 保留当前值 | | **可回滚性** | ❌ 可回滚 | ✅ 可回滚 | | **触发器触发** | ❌ 激活 DELETE 触发器 | ✅ 激活 DELETE 触发器 | | **外键约束影响** | ⚠️ 可能被阻塞 | ✅ 级联删除可配置 | #### 四、使用注意事项 1. **外键约束限制** - 若被其他外键引用,需先解除约束或使用 `DELETE`。 - MySQL 中可添加 `CASCADE` 选项(需引擎支持): ```sql TRUNCATE TABLE table_name CASCADE; -- 级联清空依赖 ``` 2. **数据恢复** - 清空后数据可通过事务回滚恢复(需提前备份)。 3. **权限要求** - MySQL 需 `DROP` 权限;SQL Server 需 `ALTER TABLE` 权限。 4. **存储空间** - 立即释放磁盘空间(`DELETE` 可能立即释放)。 #### 五、适用场景 - 快速清空测试环境数据 - 定期初始化日志/缓存 - 需要重置自增列的场景(如订单号重置) > ⚠️ **生产环境建议**: > 清空前务必确认无数据依赖,重大操作前执行 `BACKUP TABLE table_name TO '/path'`[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值