### 13.1.37 TRUNCATE TABLE 语句

[](<>)

```
TRUNCATE [TABLE] tbl_name
```

[`截断表`](truncate-table.html)完全清空一张桌子。它需要[`降低`](privileges-provided.html#priv_drop)特权。逻辑上，[`截断表`](truncate-table.html)类似于[`删除`](delete.html)删除所有行的语句，或一系列[`删除表`](drop-table.html)和[`创建表`](create-table.html)陈述。

为了实现高性能，[`截断表`](truncate-table.html)绕过删除数据的 DML 方法。因此，它不会导致`删除时`触发器触发，它不能被执行`InnoDB`具有父子外键关系的表，并且不能像 DML 操作那样回滚。然而，`截断表`如果服务器在操作期间停止，则对使用原子 DDL 支持的存储引擎的表的操作要么完全提交，要么回滚。有关详细信息，请参阅[第 13.1.1 节，“原子数据定义语句支持”](atomic-ddl.html).

虽然[`截断表`](truncate-table.html)类似于[`删除`](delete.html)，它被归类为 DDL 语句而不是 DML 语句。它不同于[`删除`](delete.html)通过以下方式：

-   截断操作删除并重新创建表，这比逐行删除要快得多，尤其是对于大型表。

-   截断操作会导致隐式提交，因此无法回滚。看[第 13.3.3 节，“导致隐式提交的语句”](implicit-commit.html).

-   如果会话持有活动表锁，则无法执行截断操作。

-   [`截断表`](truncate-table.html)失败了`InnoDB`表或[`新开发银行`](mysql-cluster.html)表（如果有的话）`外键`来自引用该表的其他表的约束。允许在同一个表的列之间进行外键约束。

-   截断操作不会为已删除的行数返回有意义的值。通常的结果是“0 行受影响”，这应该被解释为“没有信息”。

-   只要表定义有效，就可以将表重新创建为空表[`截断表`](truncate-table.html)，即使数据或索引文件已损坏。

-   任何`自动递增`值被重置为其起始值。即使对于`MyISAM`和`InnoDB`，通常不重用序列值。

-   与分区表一起使用时，[`截断表`](truncate-table.html)保留分区；也就是说，数据和索引文件被删除并重新创建，而分区定义不受影响。

-   这[`截断表`](truncate-table.html)语句不调用`删除时`触发器。

-   截断损坏的`InnoDB`支持表。

[`截断表`](truncate-table.html)出于二进制日志记录和复制的目的，将其视为 DDL 而不是 DML，并且始终记录为语句。

[`截断表`](truncate-table.html)for a table 关闭打开的表的所有处理程序[`处理程序打开`](handler.html).

在 MySQL 5.7 和更早的版本中，在具有大缓冲池的系统上和[`innodb_adaptive_hash_index`](innodb-parameters.html#sysvar_innodb_adaptive_hash_index)启用，一个`截断表`由于删除表的自适应哈希索引条目时发生的 LRU 扫描，操作可能会导致系统性能暂时下降（错误 #68184）。重新映射[`截断表`](truncate-table.html)到[`删除表`](drop-table.html)和[`创建表`](create-table.html)在 MySQL 8.0 中避免了有问题的 LRU 扫描。

[`截断表`](truncate-table.html)可以与 Performance Schema 汇总表一起使用，但效果是将汇总列重置为 0 或`空值`，而不是删除行。看[第 27.12.20 节，“性能模式汇总表”](performance-schema-summary-tables.html).

截断一个`InnoDB`驻留在 file-per-table 表空间中的表删除现有表空间并创建一个新表空间。从 MySQL 8.0.21 开始，如果表空间是使用早期版本创建的并且驻留在未知目录中，`InnoDB`在默认位置创建新表空间并将以下警告写入错误日志： DATA DIRECTORY 位置必须位于已知目录中。DATA DIRECTORY 位置将被忽略，文件将被放入默认的 datadir 位置。已知目录是由[`数据目录`](server-system-variables.html#sysvar_datadir),[`innodb_data_home_dir`](innodb-parameters.html#sysvar_innodb_data_home_dir)， 和[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)变量。拥有[`截断表`](truncate-table.html)在当前位置创建表空间，将目录添加到[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)运行前设置[`截断表`](truncate-table.html).
