【问题标题】:Difference between TRUNCATE and DELETE? [duplicate]TRUNCATE 和 DELETE 的区别? [复制]
【发布时间】:2014-10-07 16:15:39
【问题描述】:

TRUNCATEDELETE 命令做同样的工作,在这两种情况下数据都被操纵,那么为什么DELETE 命令在 DML 命令之下,而TRUNCATE 命令在 DDL 命令之下?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    删除

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

    截断

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

    【讨论】:

    • truncate 可以激活触发器:“截断触发器”。
    • 当表具有其他表的引用键时,TRUNCATE 是不可能的。
    【解决方案2】:

    当我们使用 Truncate 时,我们正在取消分配由数据分配的整个空间,而不是保存到 undo-table-space。但是,在删除的情况下,我们将所有数据放入撤消表空间,然后我们将删除所有数据。 将 TRUNCATE 置于 Oracle 上的 DDL 阵营的主要观点是:

    1. TRUNCATE 可以更改存储参数(NEXT 参数),这些是对象定义的一部分 - 在 DDL 阵营中。
    2. TRUNCATE 执行隐式提交,并且无法回滚(闪回除外) - Oracle 中的大多数(全部?)DDL 操作都这样做,没有 DML 这样做

    【讨论】:

      【解决方案3】:

      嗯,基本上你知道 DML 和 DDL 的概念,上面的区别只是记住,但关键的区别是 截断只处理数据而不影响表结构和键约束,但 另一方面 删除会影响带有 where 条件的表。

      【讨论】:

      • 如果从表中删除所有行,删除将如何改变表结构?
      猜你喜欢
      • 2010-09-13
      • 2020-01-24
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2012-12-16
      • 2015-10-13
      • 2012-08-21
      相关资源
      最近更新 更多