drop table和truncate table之间的区别?

时间:2008-09-25 20:02:32

标签: sql sql-server sybase

我有一些表格是作为报告汇总的一部分构建的。之后我根本不需要它们。有人提到截断它们会更快。

19 个答案:

答案 0 :(得分:92)

从表中删除记录会记录每次删除,并对删除的记录执行删除触发器。 Truncate是一个更强大的命令,可以在不记录每一行的情况下清空表。 SQL Server阻止您使用引用它的外键截断表,因为需要检查每行上的外键。

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

如果您确实要删除表 definitions 以及数据,只需删除表。

有关详细信息,请参阅this MSDN article

答案 1 :(得分:80)

DROP TABLE删除表。

TRUNCATE TABLE会清空它,但会留下未来数据的结构。

答案 2 :(得分:24)

DROP和TRUNC做了不同的事情:

TRUNCATE TABLE

  

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

DROP TABLE

  

删除一个或多个表定义   和所有数据,索引,触发器,   约束和许可   这些表的规格。

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

答案 3 :(得分:18)

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

DROP TABLE

  

从数据库中删除该表。

DELETE TABLE

  

没有条件删除所有行。如果有触发器和引用,那么这将处理每一行。如果存在索引,也会修改索引。

TRUNCATE TABLE

  

将行数设置为零,而不记录每一行。它和其他两者都快得多。

答案 4 :(得分:10)

这些答案都没有指出这两个操作的重要区别。删除表是可以回滚的操作。 但是,truncate无法回滚 ['TRUNCATE TABLE'也可以回滚]。这样,如果有很多行,丢弃一个非常大的表可能会非常昂贵,因为它们都必须记录在一个临时空间中,以防你决定将它回滚。

通常,如果我想摆脱一个大表,我会截断它,然后放弃它。通过这种方式,数据将被固定而不记录,并且可以删除该表,并且该丢弃将非常便宜,因为不需要记录数据。

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

答案 5 :(得分:4)

TRUNCATE TABLE保留所有旧的索引和诸如此类的东西。显然,DROP TABLE将摆脱该表,并要求您稍后重新创建它。

答案 6 :(得分:3)

Drop完全删除了表,也删除了定义。截断清空表,但没有摆脱定义。

答案 7 :(得分:3)

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

如果您不再需要它,请将其丢弃,这样就不会使您的架构混乱。

答案 8 :(得分:3)

DROP表

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操作无法回滚。

答案 9 :(得分:3)

DELETE TableA而不是TRUNCATE TableA? 一个常见的误解是他们做同样的事情。不 所以。事实上,两者之间存在很多差异。

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

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

TRUNCATE也是一个记录操作,但方式不同。 TRUNCATE记录数据页面的重新分配 存在。数据页面的重新分配意味着您的数据 行仍然实际存在于数据页中,但是 范围已标记为空以供重复使用。这是什么 使TRUNCATE操作更快,以执行DELETE。

您无法截断具有任何外键的表 限制。你将不得不删除约束,TRUNCATE the 表,并重新申请约束。

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

答案 10 :(得分:2)

truncate删除所有行,但不删除表本身,它基本上等同于没有where子句的删除,但通常更快。

答案 11 :(得分:2)

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

答案 12 :(得分:2)

我对上述一条陈述进行了更正......“截断无法回滚”

可以回滚截断。在某些情况下,您无法执行截断或删除表,例如,当您具有外键引用时。对于诸如月度报告之类的任务,我可能只是在我不再需要它时放弃表格。如果我更频繁地进行汇总报告,那么我可能会保留表格并使用truncate。

希望这会有所帮助,这里有一些您应该发现有用的信息......

有关详细信息,请参阅以下文章: http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

另外,有关delete与truncate的更多详细信息,请参阅此文章: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

谢谢! 杰夫

答案 13 :(得分:2)

  

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

     

DELETE语句删除第一行   一次并记录一个条目   每个已删除行的事务日志。   TRUNCATE TABLE删除数据   解除分配以前的数据页面   存储表的数据,只有   页面解除分配记录在   交易日志。

     

TRUNCATE TABLE删除a中的所有行   表,但表结构及其   列,约束,索引等   留下来。计数器使用的   新行的标识重置为   专栏的种子。如果你想   保留身份计数器,使用   改为删除。如果你想删除   表定义及其数据,使用   DROP TABLE语句。

     

您不能在a上使用TRUNCATE TABLE   由FOREIGN KEY引用的表   约束;相反,使用DELETE   没有WHERE子句的语句。   因为未记录TRUNCATE TABLE,   它无法激活触发器。

     

TRUNCATE TABLE可能无法使用   参与索引的表格   图。

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

答案 14 :(得分:1)

这里的答案与问题相符,但我要回答你没有问过的问题。 “我应该使用截断还是删除?”如果要从表中删除所有行,通常需要截断,因为它要快得多。为什么它要快得多?至少在Oracle的情况下,它会重置high water mark。这基本上是对数据的解除引用,并允许db将其重用于其他内容。

答案 15 :(得分:1)

  

删除声明

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

  • 删除语句比Truncate语句慢,因为它逐个删除了记录
  

截断声明

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

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

删除声明

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

答案 16 :(得分:1)

DELETE VS TRUNCATE

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

答案 17 :(得分:0)

  

DELETE

     

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

     

TRUNCATE

     

TRUNCATE从表中删除所有行。该操作无法回滚...因此,TRUCATE更快,并且不会使用与DELETE一样多的撤消空间。

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

答案 18 :(得分:0)

下拉 删除整个表及其所有结构

<强>截 从表中删除所有行 它与删除不同,它也删除行的索引