截断

维基百科,自由的百科全书
(重定向自Truncate
跳转到导航 跳转到搜索

SQL中,TRUNCATE TABLE语句是一种数据操纵语言 (DML) 操作,用于删除表中的所有行,且不会触发触发器(Trigger)。该操作的结果是快速移除表中的所有数据,通常会绕过许多完整性强制机制。它在SQL:2008英语SQL:2008标准中被正式引入。

TRUNCATE TABLE删除表中的所有行,但保留表结构及列、约束、索引等。若要删除表定义及其数据,使用DROP TABLE语句。

TRUNCATE TABLE mytable在逻辑上(而非物理上)等同于不带WHERE子句的 DELETE FROM mytable。TRUNCATE与DELETE的区分:

  • 事务处理(Oracle/MySQL):在Oracle数据库中,TRUNCATE 在执行前后会隐式执行commit提交)操作。
  • 性能与开销:通常,TRUNCATE TABLE通过释放表所占用的数据页来快速删除所有记录。这减少了记录删除日志(Logging)的资源开销,并减少了获取锁(Locks)的数量。以这种方式移除的记录无法通过rollback(回滚)操作恢复。注:PostgreSQLMicrosoft SQL Server是两个例外,它们允许在事务内对 TRUNCATE 进行提交或回滚。
  • 限制条件:TRUNCATE TABLE 语句中不能指定 WHERE 子句。
  • 外键约束:当表被外键引用时,不能使用TRUNCATE,因为该语句不会激活ON DELETE/ON UPDATE触发器,这可能导致数据不一致。
  • 自增列重置:在某些系统中,TRUNCATE会将自增列(Identity column)的计数重置回初始种子值。

兼容性问题[编辑]

  • 由于SQL-92的标准并没有“Truncate”这个SQL关键字,故于早期的SQL兼容数据库,并不支持此SQL语法。如果要达到相近的删除功能,只能用无条件的DELETE语法。(但自动递增值的字段,不会自动重置计数。)

外部链接[编辑]