截断
外观
(重定向自Truncate)
在SQL中,TRUNCATE TABLE语句是一种数据操纵语言 (DML) 操作,用于删除表中的所有行,且不会触发触发器(Trigger)。该操作的结果是快速移除表中的所有数据,通常会绕过许多完整性强制机制。它在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(回滚)操作恢复。注:PostgreSQL和Microsoft SQL Server是两个例外,它们允许在事务内对 TRUNCATE 进行提交或回滚。
- 限制条件:TRUNCATE TABLE 语句中不能指定 WHERE 子句。
- 外键约束:当表被外键引用时,不能使用TRUNCATE,因为该语句不会激活ON DELETE/ON UPDATE触发器,这可能导致数据不一致。
- 自增列重置:在某些系统中,TRUNCATE会将自增列(Identity column)的计数重置回初始种子值。
相容性問題
[编辑]- 由於SQL-92的標準並沒有「Truncate」這個SQL關鍵字,故於早期的SQL相容資料庫,並不支援此SQL語法。如果要達到相近的刪除功能,只能用無條件的DELETE語法。(但自動遞增值的欄位,不會自動重置計數。)
外部連結
[编辑]- MySQL 6.0 Reference Manual, 11.2.10 TRUNCATE Syntax
- Oracle® Database (11g Release 1) SQL Language Reference, TRUNCATE TABLE (页面存档备份,存于互联网档案馆)
- PostgreSQL 8.3 Documentation, SQL Commands, TRUNCATE (页面存档备份,存于互联网档案馆)
- MS-SQL Server 2008 - Deleting All Rows by Using TRUNCATE TABLE
| 这是一篇與软件相關的小作品。您可以通过编辑或修订扩充其内容。 |