课程 9.2: TRUNCATE 和 DROP TABLE 语句
在上一课中,我们学习了如何使用 CREATE TABLE 创建表。但在实际的数据库工作中,重要的不仅是创建结构,还要理解如何清空表或完全删除它们。为此,SQL 提供了 TRUNCATE 和 DROP TABLE 语句。
这两者都属于数据定义语言(DDL),但它们解决不同的任务。TRUNCATE 快速删除表中的所有行,而 DROP TABLE 则连同其结构一起删除表本身。
TRUNCATE 的作用
TRUNCATE 语句从表中删除所有行,但表本身仍然存在。
运行 TRUNCATE 后:
- 表结构被保留;
- 列名、数据类型和约束保持不变;
- 表变为空;
- 在许多 DBMS 中,该操作比大规模的
DELETE更快。
TRUNCATE 语法
TRUNCATE TABLE table_name;
TRUNCATE 示例
TRUNCATE TABLE logs;
之后,logs 表仍将存在于数据库中,但所有行将被删除。
DROP TABLE 的作用
DROP TABLE 语句完全删除一个表。
运行 DROP TABLE 后:
- 所有表数据被删除;
- 表结构被删除;
- 表在数据库中不再存在;
- 除非重新创建,否则在后续查询中无法引用。
DROP TABLE 语法
DROP TABLE table_name;
DROP TABLE 示例
DROP TABLE old_reports;
之后,old_reports 表将从数据库中完全删除。
TRUNCATE 与 DROP TABLE 的区别
尽管这两条语句都删除数据,但它们之间有根本的区别。
1. 删除的内容
TRUNCATE仅删除行。DROP TABLE删除行和表本身。
2. 表是否仍可使用
- 在
TRUNCATE后,表仍然存在,可以再次插入新数据。 - 在
DROP TABLE后,表消失,必须重新创建才能再次使用。
3. 使用时机
- 当您需要快速清空表而保持其结构时,
TRUNCATE是合适的。 - 当表完全不再需要时,
DROP TABLE是合适的。
TRUNCATE 与 DELETE 的区别
初学者常常将 TRUNCATE 与 DELETE 进行比较,因为这两个命令都可以从表中删除数据。
主要区别在于:
DELETE可以与WHERE一起使用,仅删除部分行;TRUNCATE一次性删除表中的所有行;DELETE属于 DML,而TRUNCATE通常被视为 DDL;- 当必须清空整个表时,
TRUNCATE在许多 DBMS 中通常更快; - 与日志记录、回滚和身份计数器重置相关的行为取决于特定的 DBMS。
如果您只需要删除部分数据,DELETE 通常是正确的选择。如果您需要快速清空整个表但保留其结构,TRUNCATE 通常更方便。
注意事项
使用 TRUNCATE 和 DROP TABLE 时,重要的是要记住一些规则:
- 始终检查您是否只需要删除数据或整个表结构;
- 如果表结构仍然需要,请勿使用
DROP TABLE; - 如果您只需要删除部分行,请勿用
TRUNCATE替代DELETE; - 请记住,在某些 DBMS 中,如果表被外键引用,则无法使用
TRUNCATE; - 请注意,
TRUNCATE的行为和回滚支持取决于特定的 DBMS。
错误使用这些语句可能导致数据或表结构的丢失。
实际示例
想象一下,我们有一个名为 daily_import 的辅助表,每天将外部系统的中间数据加载到该表中。
如果该表定期使用,但在每次新加载之前必须完全清空,则 TRUNCATE 是合适的:
TRUNCATE TABLE daily_import;
之后,表结构保持不变,可以再次加载新数据。
如果该表仅为一次性任务创建,并且不再需要,则可以完全删除:
DROP TABLE daily_import;
在第一种情况下,我们为现有表的重用做准备。在第二种情况下,我们完全从数据库中删除一个不再需要的对象。
本课要点:
TRUNCATE从表中删除所有行,但保留其结构。DROP TABLE删除数据和表本身。TRUNCATE和DELETE解决类似的问题,但工作方式不同。- 在使用它们之前,重要的是要理解您是需要清空表还是完全删除它。
TRUNCATE和DROP TABLE的行为在不同的 DBMS 中可能略有不同。
在下一课中,我们将学习临时表,并了解它们在中间结果中何时方便使用。