删除表和清空表之间的区别是什么?

83

我有一些表格,是作为报告总结的一部分进行构建的。在那之后我都不需要它们了。有人建议将它们截断,因为这样会更快。

Translated:

我在报告汇总中构建了一些表格,但之后就不再需要它们了。有人建议将其截断以提高速度。


2
你可以从以下链接中获取答案:https://dev59.com/y3I-5IYBdhLWcg3wHUZB#21058926 - php
如果你截断表格,MySQL并不会释放硬盘的空间。如果你想要回收存储空间,你应该删除表格而不是截断它。 - Emilio Nicolás
19个回答

105

从表中删除记录会记录每个删除并执行已删除记录的删除触发器。Truncate是一条更强大的命令,无需记录每行即可清空表。由于需要检查每行的外键,SQL Server防止您截断引用它的外键的表。

Truncate通常非常快速,非常适合从临时表中清除数据。它保留表的结构以备将来使用。

如果您实际上想要删除表定义以及数据,请直接删除表。

有关更多信息,请参见此MSDN文章


5
同时,截断一张表会重设自增长种子。这对测试很有帮助,因为你可以截断你的表并插入数据,并且每次都知道身份值将会是多少。如果你只是删除了表中的所有数据,那么就无法做到这一点。 - Jim
《DROP和TRUNCATE TABLE不记录日志的神话》(http://sqlperformance.com/2013/05/sql-performance/drop-truncate-log-myth)。只是额外补充两句。 - John K. N.

88

DROP TABLE删除表。

TRUNCATE TABLE清空表数据,但保留其结构以便于将来添加数据。


4
兄弟,这里面还有很多细节的,你知道的 ;) - David Aldridge
24
这是关键的不同之处。 - ceejayoz

26

DROP 和 TRUNCATE 有不同的作用:

TRUNCATE TABLE

删除表中的所有行,而不记录单个行的删除操作。TRUNCATE TABLE 类似于没有 WHERE 子句的 DELETE 语句;但是,TRUNCATE TABLE 更快,并且使用更少的系统和事务日志资源。

DROP TABLE

删除一个或多个表定义及这些表的所有数据、索引、触发器、约束和权限规范。

就速度而言,差别应该很小。无论如何,如果您根本不需要表结构,请使用 DROP。


20

我想你是指DELETE TABLE和TRUNCATE TABLE之间的区别。

DROP TABLE

从数据库中删除表。

DELETE TABLE

如果没有条件,将删除所有行。如果存在触发器和引用,则会为每一行进行处理。还会修改索引(如果有)。

TRUNCATE TABLE

将行计数设置为零,并且不记录每一行。它比另外两个都要快得多。


4
将行数设置为零实际上会将标识值设置回初始标识种子值。 - Filip De Vos

11

没有这些答案指出这两个操作的一个重要区别。删除表(Drop table)是一种可以回滚的操作。如果有许多行,那么放弃对大型表进行删除的决定将非常昂贵,因为所有这些行都必须在临时空间中记录以便您决定回滚。

通常,如果我想摆脱一个大表,我会先截断它,然后再删除它。这样数据将被删除而不留下记录,并且可以很容易地删除该表,因为不需要记录任何数据。

但值得指出的是,截断只会删除数据,而保留表本身,而删除则确实会同时删除数据和表本身(假设外键不会阻止这样的操作)。


2
这并不完全正确,TRUNCATE可以在BEGIN TRANSACTION、TRUNCATE TABLE、ROLLBACK的意义上回滚,只是不能在“还原事务日志”的意义上回滚。它记录了页面的释放。 - Mark Sowul
1
-1 DROP 基本上只是一个 TRUNCATE,然后从系统表中删除表元数据。在这里查看此问题 - Martin Smith

7

删除表

DROP TABLE [table_name];

DROP 命令用于从数据库中删除表。它是一个 DDL 命令。表中的所有行、索引和权限也将被删除。 DROP 操作无法回滚。

删除表

DELETE FROM [table_name]
WHERE [condition];

DELETE FROM [table_name];

DELETE命令是DML命令之一。它可以根据WHERE子句中指定的条件,删除表中的所有行或某些行。它使用行锁执行,表中的每一行都被锁定以进行删除操作。它会维护事务日志,因此比TRUNCATE命令慢。 DELETE操作可以回滚。

TRUNCATE表

TRUNCATE TABLE [table_name];

TRUNCATE命令可以删除表中的所有行,它不会记录每一行的删除,而是记录表的数据页的释放,因此比DELETE命令更快。使用该命令时会对整个表进行锁定以删除所有记录。它是一个DDL命令,TRUNCATE操作无法回滚。

1
这不是正确的。截断和删除可以回滚。CREATE TABLE dbo.TestTruncate(ID INT) INSERT INTO dbo.TestTruncate(ID) VALUES(1) INSERT INTO dbo.TestTruncate(ID) VALUES(2) INSERT INTO dbo.TestTruncate(ID) VALUES(3) BEGIN TRAN TRUNCATE TABLE dbo.TestTruncate DROP TABLE dbo.TestTruncate ROLLBACKSELECT * FROM dbo.TestTruncate DROP TABLE dbo.TestTruncate - InbetweenWeekends

4

TRUNCATE TABLE会保留所有旧的索引和其他内容。而DROP TABLE则会删除该表,需要稍后重新创建。


3

删除 TableA 而不是截断 TableA? 一个常见的误解是它们做的事情是一样的。实际上,两者之间有很多区别。

DELETE 是基于每行记录的已记录操作。这意味着每个行的删除都会被记录并物理删除。

您可以删除任何不违反约束条件的行,同时保留外键或任何其他约束条件。

TRUNCATE 也是一个已记录操作,但以不同的方式。TRUNCATE 记录数据存在的数据页的取消分配。数据页的取消分配意味着您的数据行仍然实际存在于数据页中,但范围已标记为空以供重用。这就是 TRUNCATE 比 DELETE 更快的原因。

您不能截断具有任何外键约束的表。您将需要删除约束,截断表,然后重新应用约束。

TRUNCATE 将重置任何标识列为默认种子值。


“每行的删除都会被记录并物理删除。”您确定这是正确的吗?MSDN博客指出,它们不会立即清除。Postgres也是这样工作的。 - Brad Koch

3

Drop会完全删除表格,包括定义。Truncate会清空表格,但不会删除定义。


3

清空表格可以使表格变为空。删除表格则是完全删除了它。两种方法都很快,但是删除表格可能会更快(这取决于您的数据库引擎)。

如果您不再需要它,请删除它,以免它混乱您的模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接