mysql/sqlserver中truncate vs delete的比较

28 mysql sql sql-server

关于mysql/sqlserver即删除/截断的一件事让我头脑发热

哪一个更好更快?

在哪里使用删除?

在哪里使用truncate?

bgs*_*bgs 97

删除

  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. 可以回滚.


  • 当与TRANSACTION一起使用时,DELETE和TRUNCATE都可以回滚(TRUNCATE可以在SQL Server中回滚,但不能在MySQL中回滚).
  • 如果PK有自动增量,truncate将重置计数器

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

  • 截断也会将自动增量值更改为1.删除不会保留现有的自动增量值 (3认同)
  • TRUNCATE**不能**回滚!http://dev.mysql.com/doc/refman/5.6/en/truncate-table.html (3认同)
  • @bgs好吧,我们即便如此.答案应该可以通过上下文来增强,并强调在TRUNCATE中MySQL和SQL Server之间的差异. (2认同)

nav*_*yal 10

区别

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

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

快点

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

在哪里使用

截短

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

删除

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