截断

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

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

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

  • 事务处理(Oracle/MySQL):在Oracle数据库中,TRUNCATE 在执行前后会隐式执行commit提交)操作。
  • 性能与开销:通常,TRUNCATE TABLE通过释放表所占用的数据页来快速删除所有记录。这减少了记录删除日志(Logging)的资源开销,并减少了获取锁(Locks)的数量。以这种方式移除的记录无法通过rollback(回滚)操作恢复。注:PostgreSQL和Microsoft SQL Server是两个例外,它们允许在事务内对 TRUNCATE 进行提交或回滚。

*限制条件:TRUNCATE TABLE 语句中不能指定 WHERE 子句。
*外键约束:当表被外键引用时,不能使用TRUNCATE,因为该语句不会激活ON DELETE/ON UPDATE触发器,这可能导致数据不一致。
*自增列重置:在某些系统中,TRUNCATE会将自增列(Identity column)的计数重置回初始种子值。
相容性問題

  • 由於SQL-92的標準並沒有「Truncate」這個SQL關鍵字,故於早期的SQL相容資料庫,並不支援此SQL語法。如果要達到相近的刪除功能,只能用無條件的DELETE語法。(但自動遞增值的欄位,不會自動重置計數。)

外部連結
*[https://web.archive.org/web/20081106062442/http://dev.mysql.com/doc/refman/6.0/en/truncate.html MySQL 6.0 Reference Manual, 11.2.10 TRUNCATE Syntax]
*[http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_10007.htm Oracle® Database (11g Release 1) SQL Language Reference, TRUNCATE TABLE]
*[http://www.postgresql.org/docs/current/static/sql-truncate.html PostgreSQL 8.3 Documentation, SQL Commands, TRUNCATE]
*[http://msdn.microsoft.com/en-gb/library/ms188249.aspx MS-SQL Server 2008 - Deleting All Rows by Using TRUNCATE TABLE]

评论 (0)

  • 还没有评论,来抢沙发吧。