SQL TRUNCATE TABLE 语句
- SQL TRUNCATE TABLE 语句
- 截断后验证表
- SQL TRUNCATE 与 DELETE
- SQL TRUNCATE 与 DROP
- 使用 TRUNCATE TABLE 的重要注意事项
在 SQL 中,有时我们需要从表中删除所有数据,但仍希望保留表结构以供将来使用。在这种情况下,我们使用 TRUNCATE TABLE 语句。
SQL TRUNCATE TABLE 语句
SQL TRUNCATE TABLE 命令用于从表中删除所有记录,而不删除表本身(即清空表)。表仍保留在数据库中,您可以稍后向其中插入新数据。
语法
SQL 中 TRUNCATE TABLE 命令的基本语法如下:
TRUNCATE TABLE table_name;
其中:
- TRUNCATE TABLE: 用于删除所有记录的 SQL 命令。
- table_name: 要删除所有数据的表名。
示例
首先,我们创建一个名为 CUSTOMERS 的表,用于存储客户的个人信息,包括姓名、年龄、地址和薪资等,如下所示:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
现在,使用 INSERT 语句向该表插入数据,如下所示:
INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ), (2, 'Khilan', 25, 'Delhi', 1500.00 ), (3, 'Kaushik', 23, 'Kota', 2000.00 ), (4, 'Chaitali', 25, 'Mumbai', 6500.00 ), (5, 'Hardik', 27, 'Bhopal', 8500.00 ), (6, 'Komal', 22, 'Hyderabad', 4500.00 ), (7, 'Muffy', 24, 'Indore', 10000.00 );
表将创建如下 −
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | Kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | Hyderabad | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
以下 SQL TRUNCATE TABLE 语句将删除 CUSTOMERS 表中的所有记录:
TRUNCATE TABLE CUSTOMERS;
截断后验证表
执行上述命令后,您可以使用 SELECT 语句验证表是否为空,如下所示:
SELECT * FROM CUSTOMERS;
如果表已被截断,结果将显示无行,如下所示:
Empty set (0.00 sec)
SQL TRUNCATE 与 DELETE
TRUNCATE 和 DELETE 命令看似相似,因为它们都会从表中删除数据,但两者之间存在一些重要区别。这些区别如下表所示:
| DELETE | TRUNCATE |
|---|---|
| 使用 WHERE 子句根据条件删除一行或多行。 | 无条件删除表中的所有行。 |
| 属于 DML(Data Manipulation Language,数据操作语言)命令。 | 属于 DDL(Data Definition Language,数据定义语言)命令。 |
| 需要手动执行 COMMIT 以永久保存更改。 | 自动提交更改;在大多数系统中无法回滚。 |
| 逐行删除并记录每个事务。 | 一次操作删除所有数据,日志记录最少。 |
| 支持 WHERE 子句来过滤要删除的行。 | 不支持 WHERE 子句。 |
| 删除时锁定每一行。 | 应用表级锁。 |
| 占用更多事务日志空间。 | 占用更少日志空间(仅记录页面释放)。 |
| Identity 列值不会重置。 | Identity 值重置为原始种子值。 |
| 需要 DELETE 权限。 | 需要 ALTER 权限。 |
| 大数据集时较慢。 | 大数据集时更快得多。 |
SQL TRUNCATE 与 DROP
在 SQL 中,TRUNCATE 和 DROP 都是用于更改表结构的命令。然而,它们在功能和对数据库的影响上有着显著差异。下表展示了它们之间的主要区别:
| DROP | TRUNCATE |
|---|---|
| 完全从数据库中删除表,包括数据、结构、约束和索引。 | 从表中删除所有数据,但保留表结构和约束不变。 |
| DDL(Data Definition Language,数据定义语言)命令。 | DDL(Data Definition Language,数据定义语言)命令。 |
| 释放表空间的内存。 | 表仍保留在数据库和内存中。 |
| 所有约束、索引和定义都会被永久删除。 | 所有约束和索引保持不变。 |
| 需要 ALTER 和 CONTROL 权限。 | 仅需要 ALTER 权限。 |
| 比 DELETE 快,但比 TRUNCATE 慢。 | 比 DROP 和 DELETE 都快。 |
使用 TRUNCATE TABLE 的重要注意事项
以下是关于 TRUNCATE TABLE 语句的一些重要注意事项:
- TRUNCATE 可以快速从表中删除所有行。
- 不能在 TRUNCATE 中使用 WHERE 子句,因为它会删除所有内容。
- 截断后,表仍保留在数据库中,可以继续使用。
- 在大多数数据库(如 MySQL)中,TRUNCATE 还会重置 auto-increment 值。
- 执行后,TRUNCATE 无法撤销,除非你的数据库支持事务且你正在使用事务。