删除表和截断表之间的区别?


Answers:


102

从表中删除记录会记录每次删除,并为删除的记录执行删除触发器。截断是一种更强大的命令,可清空表而不记录每一行。由于需要检查每一行上的外键,因此SQL Server阻止您用引用它的外键截断表。

截断通常是超快的,非常适合清除临时表中的数据。它确实保留了表的结构以备将来使用。

如果您实际上要删除表定义以及数据,只需删除表即可。

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


4
同样,截断表会重置身份种子。这对测试很有帮助,因为您可以截断表并插入数据,并且每次都知道标识值。如果您只是删除表中的所有数据,则可以这样做。
吉姆(Jim)



26

DROP和TRUNC做不同的事情:

截断表

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

滴台

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

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


20

我认为您的意思是DELETE TABLE和TRUNCATE TABLE之间的区别。

滴台

从数据库中删除表。

删除表

无条件删除所有行。如果有触发器和引用,则将对每一行进行处理。如果有一个索引,还将对其进行修改。

截断表

将行计数设置为零,并且不记录每行。与其他两者相比,速度要快得多。


4
set the row count zero它实际上将身份值设置回初始身份种子值。
Filip De Vos

11

这些答案都没有指出这两个操作之间的重要区别。删除表是可以回滚的操作。 但是,截断不能回滚['TRUNCATE TABLE'也可以回滚]。这样,如果有许多行,则删除非常大的表可能会非常昂贵,因为如果您决定将其回滚,则必须将它们全部记录在临时空间中。

通常,如果我想摆脱一个大表,我会截断它,然后将其删除。这样,无需记录就可以删除数据,并且可以删除表,并且由于无需记录数据,因此删除操作非常便宜。

重要的是要指出,尽管截断只是删除数据,而是离开表,而drop实际上会删除数据和表本身。(假设外键不排除这种动作)


2
这不是完全正确,可以在BEGIN TRANSACTION,TRUNCATE TABLE和ROLLBACK的意义上回滚TRUNCATE,而在“还原事务日志”的意义上则不能回滚。它记录页面的重新分配。
Mark Sowul 2011年

1
-1DROP基本上只是TRUNCATE从系统表中删除表元数据。在这里看到这个问题
Martin Smith

5

删除表

DROP TABLE [table_name];

DROP命令用于从数据库中删除表。这是DDL命令。该表的所有行,索引和特权也将被删除。DROP操作无法回滚。

删除表

DELETE FROM [table_name]
WHERE [condition];

DELETE FROM [table_name];

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

截断表

TRUNCATE TABLE [table_name];

TRUNCATE命令从表中删除所有行。它不会记录每行的删除,而是记录表的数据页的解除分配,这使其比DELETE更快。它使用表锁执行,并且整个表被锁定以删除所有记录。这是DDL命令。TRUNCATE操作无法回滚。


这是不正确的。截断和删除可以回滚。创建表dbo.TestTruncate(ID INT)插入dbo.TestTruncate(ID)值(1)插入dbo.TestTruncate(ID)值(2)插入dbo.TestTruncate(ID)值(3)开始TRAN截断表dbo .TestTruncate DROP TABLE dbo.TestTruncate ROLLBACK SELECT * FROM dbo.TestTruncate DROP TABLE dbo.TestTruncate
InbetweenWeekends


3

Drop完全摆脱了表,同时也删除了定义。截断将清空表,但不会删除该定义。


3

截断表将清空表。删除表会完全删除它。任一种都会很快,但是删除它可能会更快(取决于您的数据库引擎)。

如果您不再需要它,请将其删除,以免使您的架构混乱。


3

删除TableA而不是TRUNCATE TableA?一个普遍的误解是他们做同样的事情。不是这样 实际上,两者之间有很多差异。

DELETE是每行记录的操作。这意味着将记录每行的删除并进行物理删除。

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

TRUNCATE也是一个记录的操作,但是方式不同。TRUNCATE记录数据所在的数据页的重新分配。数据页的重新分配意味着您的数据行实际上仍然存在于数据页中,但是扩展区已被标记为空以供重用。这就是使TRUNCATE更快地执行删除操作的原因。

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

TRUNCATE会将所有标识列重置为默认种子值。


“记录每行的删除并实际删除”。您确定正确吗?在MSDN博客说,他们不会立即清除。这也是Postgres的工作方式。
布拉德·科赫

2

truncate删除所有行,但不删除表本身,从本质上讲,它等效于不带where子句的删除,但通常更快。


截断速度更快,因为它不会记录事务(我相信),因此您无法像删除操作一样从截断中回滚。
史蒂芬·穆拉斯基

2

我对上面的一种说法有更正...“截断不能回滚”

截断可以回滚。在某些情况下,您无法进行截断或删除表,例如,当您具有外键引用时。对于诸如月度报告之类的任务,一旦不再需要它,我可能会丢掉桌子。如果我经常进行汇总报告,那么我可能会保留该表并使用truncate。

希望对您有帮助,这里有一些您应该会觉得有用的信息...

请参阅以下文章以了解更多详细信息:http : //sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

另外,有关删除和截断的更多详细信息,请参见本文:http : //www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

谢谢!杰夫


2

TRUNCATE TABLE在功能上与没有WHERE子句的DELETE语句相同:都删除表中的所有行。但是TRUNCATE TABLE比DELETE更快,并且使用更少的系统和事务日志资源。

DELETE语句一次删除一行,并在事务日志中为每个删除的行记录一个条目。TRUNCATE TABLE通过重新分配用于存储表数据的数据页面来删除数据,并且只有页面取消分配记录在事务日志中。

TRUNCATE TABLE删除表中的所有行,但表结构及其列,约束,索引等仍然保留。标识用于新行的计数器将重置为该列的种子。如果要保留身份计数器,请改用DELETE。如果要删除表定义及其数据,请使用DROP TABLE语句。

您不能在FOREIGN KEY约束引用的表上使用TRUNCATE TABLE;而是使用不带WHERE子句的DELETE语句。由于未记录TRUNCATE TABLE,因此无法激活触发器。

TRUNCATE TABLE不能用于参与索引视图的表。

来自http://msdn.microsoft.com/zh-cn/library/aa260621(SQL.80).aspx


2

在SQL标准中,DROP表删除该表,而表模式-TRUNCATE删除所有行。


1

此处的答案与问题相符,但我将回答您没有提出的问题。“我应该使用截断还是删除?” 如果要从表中删除所有行,通常会希望截断,因为这样做要快得多。为什么要快得多?至少在Oracle中,它会重置高水位线。这基本上是对数据的取消引用,并允许db将其重用于其他用途。


1

删除与截断

  1. DELETE语句一次删除一行,并在事务日志中为每个删除的行记录一个条目。TRUNCATE TABLE通过取消分配用于存储表数据的数据页面来删除数据,并仅在事务日志中记录页面取消分配
  2. 我们可以在中使用WHERE子句,DELETETRUNCATE不能在其中使用
  3. DELETE使用行锁执行该语句时,表中的每一行都被锁定以删除。TRUNCATE TABLE始终锁定表和页面,但不锁定每一行
  4. DELETE执行语句后,该表仍可以包含空白页。如果删除操作未使用表锁,则该表(堆)将包含许多空白页。对于索引,删除操作可以留下空白页,尽管这些
    页将通过后台清理过程快速释放。
  5. TRUNCATE TABLE 从表中删除所有行,但表结构及其列,约束,索引等仍保留
  6. DELETE语句不RESEED标识列,但TRUNCATE声明RESEEDSIDENTITY
  7. 您不能TRUNCATE TABLE在以下表上使用:
    1. FOREIGN KEY约束引用。(您可以截断具有引用自身的外键的表。)
    2. 参与索引视图。
    3. 通过使用事务复制或合并复制来发布
  8. TRUNCATE TABLE 无法激活触发器,因为该操作不会记录单个行的删除

1

删除声明

Delete语句删除表行并返回从表中删除的行数。在此语句中,我们使用where子句从表中删除数据

  • Delete Statement比Truncate语句慢,因为它删除记录一个接一个

截断语句

截断语句Delete表或从表中删除所有行。

  • 它比Delete语句快,因为它删除了表中的所有记录
  • 截断语句不返回从表中删除的行数

删除声明

Drop语句删除了所有记录以及表的结构


1

删除 整个表及其所有结构

截断 从表中删除所有行与删除它还删除行索引不同


0

删除

DELETE命令用于从表中删除行。WHERE子句只能用于删除某些行。如果未指定WHERE条件,则将删除所有行。执行DELETE操作后,您需要COMMIT或ROLLBACK事务以使更改永久或撤消。

截短

TRUNCATE删除表中的所有行。操作无法回滚...因此,TRUCATE速度更快,并且使用的撤消空间不如DELETE那样多。

来自:http : //www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.