【问题标题】:what is the diffrence between truncate and delete in sql server?sql server中的截断和删除有什么区别?
【发布时间】:2011-02-15 08:06:52
【问题描述】:

谁能提供我在 SQL Server 中截断和删除之间所有差异的列表?

【问题讨论】:

标签: sql-server-2005


【解决方案1】:

你应该在问之前用谷歌搜索它。

截断

  1. 截断删除所有引用 来自数据库。
  2. 快速
  3. 事务日志中没有条目。
  4. 一旦移除就无法恢复。
  5. 页面引用已清除。
  6. 全部或无
  7. 标识列重新初始化 播种
  8. 截断为 DDL

截断表 tblName

不能给出条件

删除

  1. 在事务日志中进行输入。
  2. 可恢复
  3. 基于每条记录的删除
  4. 参考文献保留在页面中
  5. 标识从其前一个开始 位置
  6. DML
Delete FROM tableName

这两种方式都不会对表格产生任何结构。在执行任何操作之前,必须删除所有引用,尽管它不适用于与 Cascade = true for delete 一起使用时的删除

【讨论】:

  • 对。截断是 DDL,删除是 DML。
  • ...此外,TRUNCATE 不能用于外键约束引用的表。
  • 感谢更新答案,我也在编辑您的 cmets 以使其更完整
  • 感谢 Gupta,您的第 7 个差异使一些比其他差异更有价值,它是一个值得学习的新差异。
  • @Konerak:“截断是 DDL”这对我来说是新的,我以前不知道。谢谢
【解决方案2】:

在处理数据库时,我们在不知道它们之间的区别以及何时使用它们的情况下使用 Delete 和 Truncate。在本文中,我们将讨论Sql中Delete和Truncate的区别。

删除 删除是一个 DML 命令。 删除语句使用行锁执行,表中的每一行都被锁定以进行删除。 我们可以在 where 子句中指定过滤器。 如果 where 条件存在,它将删除指定的数据。 删除活动是一个触发器,因为该操作是单独记录的。 比截断慢,因为它保留日志 截短 截断是一个 DDL 命令。 截断表总是锁定表和页面,但不是每一行。因为它删除了所有数据。 不能使用 Where 条件。 它删除所有数据。 截断表无法激活触发器,因为该操作不记录单个行删除。 在性能方面更快,因为它不保留任何日志。 笔记 与 Transaction 一起使用时,Delete 和 Truncate 都可以回滚。 如果 Transaction 完成,意味着已提交,那么我们无法从日志文件中回滚 Truncate 命令,但我们仍然可以从日志文件中回滚删除命令,因为删除写入将它们记录在日志文件中,以防将来需要从日志文件中回滚。

如果您有一个外键约束引用您要截断的表,即使引用表中没有数据,这也不起作用。这是因为外键检查是使用 DDL 而不是 DML 完成的。这可以通过暂时禁用表的外键约束来解决。

删除表是一个记录操作。因此,每行的删除都会记录在事务日志中,这使得它变慢了。 Truncate table 也会删除表中的所有行,但它不会记录每一行的删除,而是记录表的数据页的释放,这样会更快。

~ 如果不小心使用删除/截断从表中删除了所有数据。您可以回滚已提交的事务。恢复上次备份并运行事务日志,直到删除/截断即将发生。

在Sql中截断命令后查看这篇文章回滚表或

difference-between-delete-truncate-in

另见when-to-use-truncate-and-delete-command

【讨论】:

    【解决方案3】:

    截断和删除的区别如下:

    +----------------------------------------+----------------------------------------------+
    |                Truncate                |                    Delete                    |
    +----------------------------------------+----------------------------------------------+
    | We can't Rollback after performing     | We can Rollback after delete.                |
    | Truncate.                              |                                              |
    |                                        |                                              |
    | Example:                               | Example:                                     |
    | BEGIN TRAN                             | BEGIN TRAN                                   |
    | TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
    | SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
    | ROLLBACK                               | ROLLBACK                                     |
    | SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
    +----------------------------------------+----------------------------------------------+
    | Truncate reset identity of table.      | Truncate reset identity of table.            |
    +----------------------------------------+----------------------------------------------+
    | It locks the entire table.             | It locks the table row.                      |
    +----------------------------------------+----------------------------------------------+
    | Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
    | command.                               | command.                                     |
    +----------------------------------------+----------------------------------------------+
    | We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
    +----------------------------------------+----------------------------------------------+
    | Trigger is not fired while truncate.   | Trigger is fired.                            |
    +----------------------------------------+----------------------------------------------+
    | Syntax :                               | Syntax :                                     |
    | 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
    |                                        | 2) DELETE FROM table_name WHERE              |
    |                                        |    example_column_id IN (1,2,3)              |
    +----------------------------------------+----------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多