TRUNCATE和DELETE有什么区别?

5

TRUNCATEDELETE 命令执行相同的任务,两种情况下都会操作数据,那么为什么 DELETE 命令属于 DML 命令,而 TRUNCATE 命令属于 DDL 命令呢?

3个回答

9

删除

  1. DELETE是一种DML命令。
  2. 使用行锁执行DELETE语句,表中的每一行都会被锁定以便删除。
  3. 我们可以在WHERE子句中指定筛选条件。
  4. 如果有WHERE条件存在,则删除指定的数据。
  5. 因为操作被单独记录,所以DELETE会激活触发器。
  6. 比TRUNCATE慢,因为它会保留日志。
  7. 可以回滚。

截断

  1. TRUNCATE是一种DDL命令。
  2. TRUNCATE TABLE总是锁定整个表和页,但不锁定每一行。
  3. 不能使用WHERE条件。
  4. 将删除所有数据。
  5. TRUNCATE TABLE无法激活触发器,因为该操作不记录单独的行删除。
  6. 在性能方面更快,因为它不会保留任何日志。
  7. 不能回滚。

truncate 可以激活触发器:一个“截断触发器”。 - user330315
当表格具有对其他表格的引用键时,无法使用TRUNCATE。 - Wernfried Domscheit

5
当我们使用Truncate时,我们正在释放分配给数据的整个空间,而不将其保存到undo表空间中。但是,在删除时,我们会将所有数据放入undo表空间,然后再删除所有数据。 把TRUNCATE放在Oracle的DDL阵营中的主要原因是:
  1. TRUNCATE可以更改存储参数(NEXT参数),这些参数是对象定义的一部分 - 这是DDL阵营的一部分。
  2. TRUNCATE进行隐式提交,无法回滚(闪回除外) - Oracle中的大多数(全部?)DDL操作都会执行此操作,而DML不会。

2

基本上,您了解DML和DDL概念,上述区别只是要记住的关键区别是 Truncate只操作数据而不影响表结构和主键约束, 而另一方面, Delete将在where条件下影响表。


如果从表中删除所有行,delete语句会如何改变表结构? - Mansi Raval

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接