Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
删除表中的所有行,但不删除表定义。
TRUNCATE TABLE [ owner.]table-name | MATERIALIZED VIEW [ owner.]materialized-view-name
TRUNCATE 语句会删除表或实例化视图中的所有行。
在同步或复制所涉及的数据库上应谨慎使用 TRUNCATE TABLE 语句,因为该语句与没有 WHERE 子句的 DELETE 语句相似,它会删除表中的所有行。但是 TRUNCATE 语句不会导致触发任何触发器。此外,行的删除操作不记入事务日志,因此不会进行同步或复制。这样可导致出现不一致的情况,这种不一致会引起同步或复制失败。
执行 TRUNCATE 语句后,对象的模式及所有索引仍然存在,直到执行 DROP 语句为止。模式定义和约束保持不变,触发器和权限仍然有效。
table-name 可以是基表的名称,也可以是临时表的名称。
使用 TRUNCATE TABLE 时,如果满足以下所有条件,则执行快速表截断:
没有到表的外键,也没有来自表的外键。
TRUNCATE TABLE 语句不在触发器内执行。
TRUNCATE TABLE 语句不在原子语句内执行。
如果执行快速截断,事务日志中不会记录单独的 DELETE 操作,而且在截断操作之前和之后都会执行 COMMIT 操作。快速截断不能在快照事务内使用。
如果试图对构建了快速文本索引的表或快速视图所引用的表使用 TRUNCATE TABLE,则截断会失败。对于非快速文本索引或实例化视图则不会出现这种情况;但强烈建议您先截断相关索引和实例化视图中的数据,再对表执行 TRUNCATE TABLE 语句,然后刷新索引和实例化视图。
必须是表的所有者,具有 DBA 权限或表的 ALTER 权限。
对于基表和实例化视图,TRUNCATE 语句需要有表的独占访问权,因为操作是原子操作(要么删除所有行,要么不删除任何行)。这意味着必须将任何打开的引用了要截断的表的游标关闭,还必须执行 COMMIT 或 ROLLBACK 语句以释放对表的引用。
对于临时表,由于每个用户都有自己的数据副本,因此执行 TRUNCATE 语句时不需要独占访问。
截断实例化视图时,您会将视图的状态更改为未初始化。
TRUNCATE 语句不会触发 Delete 触发器。
执行 TRUNCATE 语句之前和之后都会执行 COMMIT。
各行删除操作不记入事务日志,因此不复制 TRUNCATE 操作。不要在 SQL Remote 复制或 MobiLink 远程数据库中使用此语句。
如果表包含的列被定义为 DEFAULT AUTOINCREMENT 或 DEFAULT GLOBAL AUTOINCREMENT,则截断操作将重置该列的下一个可用值。
SQL/2008 TRUNCATE TABLE 语句是 SQL/2008 标准的可选语言功能 F200。TRUNCATE MATERIALIZED VIEW 是服务商扩充。
删除 Departments 表的所有行:
TRUNCATE TABLE Departments;