在table_a中删除和在MySQL中截断表table_a有什么区别?

时间:2009-11-25 11:18:22

标签: mysql

MySQL中DELETE FROM table_aTRUNCATE TABLE table_a之间有什么区别?

8 个答案:

答案 0 :(得分:9)

  • 截断更快
  • 截断重置自动增量
  • 截断不是交易安全 - 它会自动提交
  • 删除不必删除所有行

Truncate Documentation
Delete Documentation

答案 1 :(得分:1)

Delete允许您使用WHERE子句,因此只删除某些行。截断将删除所有行以及重置您可能拥有的任何auto_increment列。

答案 2 :(得分:1)

截断:

  • 通过释放表中的所有数据页来工作。
  • 将删除所有数据 - 您不能使用WHERE子句限制它。
  • 不会记录删除。
  • 不会触发触发器。
  • 如果有任何外键引用该表,则无法使用。
  • 重置自动ID计数器。
  • 更快。

删除:

  • 通过逐行删除来工作。
  • 可以使用WHERE子句进行限制。
  • 删除记录在事务日志中(如果您已明显登录),因此可以在必要时恢复删除(取决于您的日志记录设置)。
  • 触发了触发器。
  • 可以在具有外键的表格上使用(取决于您的键级联设置)。
  • 慢。

答案 3 :(得分:0)

截断重置id计数,如果它自动递增

答案 4 :(得分:0)

不确定MySQL(这就是为什么我的答案是wiki)但我可以告诉你至少一个其他DBMS的一个区别。 delete from命令用于表示事务(允许回滚)和触发器,这使得清除表的速度慢得多。另一方面,Truncate只是消灭了行而没有回滚的可能性,也没有在已删除的行上运行任何触发器。

答案 5 :(得分:0)

如果没有外键,truncate table丢弃&重新创建表,这比删除单个行快得多。

truncate也会重置任何自动增量计数器。

截断表时,不会触发ON DELETE触发器。

更多信息可在MySQL online documentation

中找到

答案 6 :(得分:0)

使用delete删除的数据存储在临时表中,因此您可以使用带删除命令的事务,而truncate命令直接删除数据,因此您无法使用事务进行恢复(回滚)。 这就是截断比删除更快的原因。 Delete允许使用where子句,而Truncate则不允许。

答案 7 :(得分:0)

删除:
删除mysql分配的行和空格
数据可以再次回滚
你可以将它与WHERE子句一起使用
截断:
它类似删除。但不同之处在于您无法再次回滚数据而且您无法使用WHERE子句。