SQL 中 TRUNCATE 和 DELETE 的区别
在 SQL 中删除表数据时,TRUNCATE 和 DELETE 提供了两种选择。理解它们的不同特性对于做出明智的决策至关重要。
总体概述
如果目的是快速删除表中所有行且无需保留任何数据,TRUNCATE 通常比 DELETE 更快。但是,也应考虑特定系统的因素。
语句类型
TRUNCATE 被归类为数据定义语言 (DDL) 语句,而 DELETE 是数据操纵语言 (DML) 语句。这种区别会影响它们在某些上下文中的行为。
提交和回滚
取决于数据库厂商,TRUNCATE 可能是可回滚的,也可能不是。PostgreSQL 和 SQL*Server 允许回滚 TRUNCATE,而 Oracle 将其视为已提交的操作。
空间回收
TRUNCATE 通过释放已分配的数据段来回收存储空间。另一方面,DELETE 保留已删除行占用的空间。
行范围
TRUNCATE 删除表中的所有行,而 DELETE 可以根据条件来定位特定行。
对象类型
TRUNCATE 可应用于表或整个集群(特定于厂商)。DELETE 适用于表和集群中的表。
数据对象标识
在 Oracle 中,DELETE 不影响数据对象 ID,但 TRUNCATE 会分配一个新的 ID,除非表中之前有过数据插入。
闪回 (Oracle)
DELETE 支持闪回,允许从先前状态恢复数据。另一方面,TRUNCATE 阻止对截断之前的状态进行闪回操作。但是,Oracle 11gR2 的 FLASHBACK ARCHIVE 功能可以减轻这个问题。
权限
授予 TRUNCATE 权限的能力因厂商而异。Oracle 需要 DROP ANY TABLE 权限,而其他系统可能允许将此权限授予特定用户或角色。
索引
Oracle 中的 TRUNCATE 会重新启用不可用的索引。DELETE 没有此效果。
外键
如果存在对表的活动外键引用,则无法执行 TRUNCATE。DELETE 的行为取决于外键的配置。
触发器
DDL 触发器可以被 TRUNCATE 操作激活,而 DML 触发器不会被触发。
远程执行
在 Oracle 中,无法通过数据库链接执行 TRUNCATE。
标识列
在 SQL*Server 中,TRUNCATE 重置 IDENTITY 列的序列,而 DELETE 不会。
以上是SQL 中的 TRUNCATE 与 DELETE:我什么时候应该使用哪个?的详细内容。更多信息请关注PHP中文网其他相关文章!