truncate和delete是否产生相同的结果?

nwlqm0z1  于 2021-08-01  发布在  Java
关注(0)|答案(4)|浏览(205)

我知道这听起来像是这个问题已经得到了回答,但没有,我已经阅读了所有其他问题和他们的答案,我问的是不同的。我知道truncate是ddl,delete是dml,我知道delete可以和where一起使用,只删除一行,truncate删除整个列,等等。
我已经阅读了所有这些答案:在mysql中,delete from table_a和truncate table_a有什么区别?truncate和delete有什么区别?
在sql查询中truncate和delete命令有什么区别
在SQLServer中截断和删除有什么区别?
我想问的是,这两种说法是否产生了相同的结果?

DELETE FROM my_table;

TRUNCATE TABLE my_table;

我读得越多,我就越困惑,所以请说真假,然后解释一下。
我知道这听起来很蠢,但请帮忙。

nzrxty8p

nzrxty8p1#

假- 我将在mysql的innodb引擎的上下文中解释。您为问题添加了mysql和oracle11g标签。

删除

删除可以是事务的一部分。操作可以回滚。它将旧记录复制到回滚段,如果提交,则这些记录版本将被垃圾收集。如果回滚,记录版本将还原到表中。
delete不会重置表的自动增量计数器。
delete不会创建新的表空间。表空间的大小不会缩小。因此,它不会减少磁盘上表的占用空间,它只会将表空间中的大部分页标记为“空闲”,即可能被后续数据覆盖。
delete对每个受影响的行执行delete触发器。
delete需要delete特权。
可以使用join子句执行delete操作,因此可以选择在一条语句中从多个表中删除。
如果您使用二进制日志来记录更改 binlog_format=ROW ,二进制日志将填充与删除的行数相同的行图像。这会占用很多空间。

截断表

truncate table是一个ddl语句,如您所说,因此它执行隐式提交。
truncate table创建一个具有最小大小的新表空间,并删除原始表空间。
truncate table重置相应表的自动增量。
truncate table不会将任何记录复制到回滚段。
截断表不执行任何触发器。
truncate table需要drop特权。
每个语句只能截断一个表。
截断表不会占用大表日志中的更多空间。ddl语句总是以语句格式写入二进制日志,即使您设置了 binlog_format=ROW .
truncate table基本上等价于以下序列:

CREATE TABLE new_table LIKE original_table; -- i.e. with zero rows
  RENAME TABLE original_table TO table_to_drop, new_table TO original_table;
  DROP TABLE table_to_drop;
6tdlim6h

6tdlim6h2#

你问过oracle和mysql。这个答案是针对甲骨文的。
不。 TRUNCATE 删除表中的所有行,并将堆的“高水位线”重置为“零”,从而有效地释放表空间中的磁盘分配。 DELETE 只需删除行,这样磁盘空间仍将分配给表,即使它不再有任何行。

8e2ybdfx

8e2ybdfx3#

答案很简单,是的,在很大程度上它们产生了相同的结果——一个没有记录的表。虽然还有其他差异(如触发器的处理方式),但对我来说,最大的差异是:
truncate不会更新日志,因此无法回滚。
因为它不更新日志,所以运行得更快
所以,我建议谨慎地使用truncate,但是,如果您完全确定需要一个空表,我会使用它。

fv2wmkja

fv2wmkja4#

删除

这是一个dml命令。它删除表中特定的数据行。能告诉我们哪里有条件。可以提交。可以回滚。截断

这是一个ddl命令。它删除了表中的数据。能告诉我们哪里有条件。不能回滚。自动提交。

相关问题