mysql / sqlserver中truncate vs delete的比较

时间:2013-12-13 05:46:32

标签: mysql sql sql-server

关于mysql / sqlserver,我的脑子里有一件事,即删除/截断

哪一个更好更快?

在哪里使用删除?

在哪里使用truncate?

4 个答案:

答案 0 :(得分:94)

删除

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

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

      • DELETE和TRUNCATE两者都可以在使用时回滚 TRANSACTION(TRUNCATE可以在SQL Server中回滚,但在MySQL中不回滚)。
      • 如果有自动增量的PK,则截断 重置计数器

      http://beginner-sql-tutorial.com/sql-delete-statement.htm

答案 1 :(得分:9)

差分

最重要的区别是DELETE操作是事务安全的并且已记录,这意味着可以回滚DELETE。 TRUNCATE无法在事务内完成,无法回滚。因为没有记录TRUNCATE,所以恢复错误的TRUNCATEd表比从DELETE恢复要大得多。

如果外键约束被破坏,DELETE将失败; TRUNCATE可能不会遵守外键约束(它适用于InnoDB表)。 DELETE将触发任何ON DELETE触发器; TRUNCATE不会。

FASTER

截断操作删除并重新创建表,这比逐个删除行要快得多,特别是对于大表。

在哪里使用

当表设置为空时,需要将自动递增键重置为1。 它比DELETE更快,因为它删除了所有数据。 DELETE将扫描表以生成受影响的行数。

删除

需要根据可选的WHERE子句删除行。 需要日志并应用外键约束

答案 2 :(得分:2)

DELETE命令用于从表中删除行

TRUNCATE删除表中的所有行。无法回滚操作,也不会触发任何触发器。因此,TRUNCATE速度更快,并且不会使用与DELETE一样多的撤消空间。

答案 3 :(得分:0)

差异:

1)从表中删除完整数据,下一个自动增量ID将从1开始,其中删除将以下一个ID开始。
2)两者都将保持结构完整并仅删除数据 3)删除你可以使用限制,如截断你不能。