Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (P-Z)

 

TRUNCATE 语句

此语句用于删除表中的所有行,但不删除表定义。

语法
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 语句,然后刷新索引和实例化视图。请参见TRUNCATE 语句TRUNCATE TEXT INDEX 语句

权限
  • 必须是表的所有者,具有 DBA 权限或表的 ALTER 权限。

  • 对于基表和实例化视图,TRUNCATE 语句需要有表的独占访问权,因为操作是原子操作(要么删除所有行,要么不删除任何行)。这意味着必须将任何打开的引用了要截断的表的游标关闭,还必须发出 COMMIT 或 ROLLBACK 语句以释放对表的引用。

  • 对于临时表,由于每个用户都有自己的数据副本,因此执行 TRUNCATE 语句时不需要独占访问。

副作用
  • 截断实例化视图时,您会将视图的状态更改为未初始化。请参见实例化视图状态和属性

  • TRUNCATE 语句不会触发 Delete 触发器。

  • 执行 TRUNCATE 语句之前和之后都会执行 COMMIT。

  • 各行删除操作不记入事务日志,因此不复制 TRUNCATE 操作。不要在 SQL Remote 复制或 MobiLink 远程数据库中使用此语句。

  • 如果表包含的列被定义为 DEFAULT AUTOINCREMENT 或 DEFAULT GLOBAL AUTOINCREMENT,则截断操作将重置该列的下一个可用值。

另请参见
标准和兼容性
  • SQL/2003   Transact-SQL 扩充。

示例

删除 Departments 表的所有行:

TRUNCATE TABLE Departments;