清空表¶
可以删除表的所有行,而表还存在,但是是一个空表。比如,考虑一张包含年度数据的表,在每年年底,在备份数据后,可能需要清空表的所有数据。
为了清空表的所有数据,可以有以下几种选择:
- 使用DELETE语句
- 使用DROP 和 CREATE 语句
- 使用TRUNCATE语句
下面分别介绍各个选项:
- 用DELETE语句
可以用DELETE语句清空表的所有行。 比如,下面的语句删除表staff的全部行:
DELETE FROM staff;
如果表有很多行,使用DELETE语句将占用大量的系统资源,比如,CPU时间、日志空间以及相关的索引也要占用资源。而且,当删除每一行时,将触发定义在这个表上的触发器。表保留原先分配给这个表的数据空间。DELETE语句时,也可以选择删除哪些行,而TRUNCATE和DROP将影响整个对象。
- 使用DROP与CREATE语句
也可以删除一张表,然后重新创建这张表,比如,下面的语句删除然后重新创建了staff表:
DROP TABLE staff CASCADE;
CREATE TABLE staff(a INT);
当删除和重新创建一张表时,所有相关的索引,约束完整性和触发器也同时删掉了,所有依赖这个表的对象的依赖关系也无效了。另外,所有的对这个对象的授权也删除了。
- 使用TRUNCATE语句
可以使用TRUNCATE语句删除表的所有行。比如,下面的语句清空staff表:
TRUNCATE TABLE staff;
使用TRUNCATE语句提供了一种更快、更有效的方法来删除表的所有行。TRUNCATE语句是不可回滚的。不能在事务块中使用。TRUNCATE语句不会影响表相关的索引、触发器的结构以及授权。TRUNCATE语句将回收分配给对象的数据空间。
如果其他表外键约束依赖于清空的表,将返回一个错误,而不运行清空操作。