SQL中的TRUNCATE和DELETE有啥区别

Posted

技术标签:

【中文标题】SQL中的TRUNCATE和DELETE有啥区别【英文标题】:What's the difference between TRUNCATE and DELETE in SQLSQL中的TRUNCATE和DELETE有什么区别 【发布时间】:2010-09-13 11:15:21 【问题描述】:

SQL 中TRUNCATEDELETE 有什么区别?

如果您的回答是针对特定平台的,请注明。

【问题讨论】:

所有答案都是特定于平台的。标准 SQL 中没有 TRUNCATE 命令。因此,它是一项专有功能,对每个 DBMS 供应商来说意味着不同的东西。 答案是非常具体的实现,因为它必须是,因为正如 sqlvogel 指出的那样,这是一个非标准命令(TRUNCATE)。要么留下这个标记为“oracle”,要么让它成为一个社区维基风格的答案,并为每个主要的 RDBMS(Oracle、MS-MSQL、PostgreSQL 都实现 TRUNCATE...)考虑后果。 如果Transaction完成,意味着COMMITED,那么我们不能回滚TRUNCATE命令,但是我们仍然可以从LOG文件中回滚DELETE命令,因为DELETE write会将它们记录在Log文件中,以防需要回滚将来从 LOG 文件中获取。 【参考方案1】:

以下是差异列表。我已经强调了 Oracle 特定的特性,希望社区也可以添加其他供应商的特定差异。大多数供应商共有的差异可以直接放在标题下方,差异突出显示在下面。


一般概述

如果您想快速删除表中的所有行,并且您确实确定要这样做,并且您没有针对表的外键,那么 TRUNCATE 可能会更快而不是 DELETE。

必须考虑各种特定于系统的问题,如下所述。


语句类型

删除为 DML,截断为 DDL (What is DDL and DML?)


提交和回滚

因供应商而异

SQL*Server

截断可以回滚。

PostgreSQL

截断可以回滚。

甲骨文

因为 TRUNCATE 是 DDL,它涉及两次提交,一次在语句执行之前,一次在语句执行之后。截断因此无法回滚,并且截断过程中的失败无论如何都会发出提交。

但是,请参阅下面的闪回。


空间回收

删除不恢复空间,截断恢复空间

甲骨文

如果您使用 REUSE STORAGE 子句,则不会取消分配数据段,如果要重新加载表中的数据,这可能会稍微更有效。高水位线被重置。


行范围

删除可用于删除所有行或仅删除部分行。截断删除所有行。

甲骨文

当对表进行分区时,可以单独截断各个分区,因此可以部分删除表的所有数据。


对象类型

删除可以应用于表和集群内的表。截断仅适用于表或整个集群。 (可能是 Oracle 特定的)


数据对象标识

甲骨文

删除不影响数据对象 id,但 truncate 分配一个新的数据对象 id除非自创建以来从未对表进行过插入即使是回滚的单个插入也会导致截断时分配的新数据对象 ID。


闪回 (Oracle)

闪回可跨删除操作,但截断可防止闪回到操作之前的状态。

但是,从 11gR2 开始,FLASHBACK ARCHIVE 功能允许这样做,但 Express Edition 除外

Use of FLASHBACK in Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


权限

变量

甲骨文

可以将表上的删除权限授予另一个用户或角色,但如果不使用 DROP ANY TABLE 权限,则不能截断。


重做/撤消

删除会产生少量的重做和大量的撤消。截断每个生成的数量可以忽略不计。


索引

甲骨文

截断操作使不可用的索引再次可用。删除不会。


外键

当启用的外键引用表时,不能应用截断。删除处理取决于外键的配置。


表格锁定

甲骨文

截断需要独占表锁,删除需要共享表锁。因此,禁用表锁是一种防止对表进行截断操作的方法。


触发器

DML 触发器不会在截断时触发。

甲骨文

DDL 触发器可用。


远程执行

甲骨文

不能通过数据库链接发出截断。


身份列

SQL*Server

截断重置 IDENTITY 列类型的序列,删除不会。


结果集

在大多数实现中,DELETE 语句可以将已删除的行返回给客户端。

例如在 Oracle PL/SQL 子程序中,您可以:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

【讨论】:

不明白你的第四句话:如果我说 DELETE [] FROM Table;那么该表中的 *all 行将被删除,除非 FK 停止它。顺便说一句,我猜这是特定于 SQL Server 的,您不能在带有 FK 的表上使用 TRUNCATE。 还有一些 cmets:我不同意您的第三条陈述,除非它是特定于 Oracle 的。至少对于 SQL S。如果您删除或截断,除非您特别要求,否则您不会恢复空间(即数据库文件不会在硬盘驱动器上缩小)。 第 5 条语句:您可以在 sql 2008 r2 上回滚 TRUNCATE TABLE Postgresql 可以回滚 TRUNCATE,因此也不会自动提交它。 DELETE 返回删除的行数,但 TRUNCATE 不返回。这是非常愚蠢的一点,但值得一提:)【参考方案2】:

截断和删除的区别如下:

+----------------------------------------+----------------------------------------------+
|                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.      | Delete does not 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)              |
+----------------------------------------+----------------------------------------------+

【讨论】:

Truncate reset identity of table 什么意思?但是,删除呢? @jWeaver:这意味着当您将主键字段的标识规范属性设置为 True 时,因此当您将数据插入该表时,主键列的值类似于 1,2,3,4,5 ....(如果标识从 1 开始,种子为 1),当您截断表时,它将丢失所有标识值,因此当您再次开始将数据插入该表时,它将从 1 开始,而不是最后离开的位置.在 DELETE 中,它是相反的,即使在您执行 DELETE 语句之后它也会保留标识值。抱歉,上图中 DELETE 列中的第二个比较点错误。 好像你在回答 SQL SERVER TRUNCATE 和 DELETE 都可以在 SQL SERVER 中回滚。并且在第二行 DELETE 不会重置身份。现在你怎么能编辑这篇文章?这就是在 *** 中使用图片的坏处。 正在回滚截断! (SQL 服务器)【参考方案3】:

丢弃

DROP 命令从数据库中删除一个表。所有表的行、索引和权限也将被删除。不会触发任何 DML 触发器。该操作无法回滚。

截断

TRUNCATE 从表中删除所有行。该操作无法回滚,也不会触发任何触发器。因此,TRUNCATE 速度更快,并且不像 DELETE 那样使​​用太多的撤消空间。截断时会添加表级锁。

删除

DELETE 命令用于从表中删除行。 WHERE 子句可用于仅删除某些行。如果未指定 WHERE 条件,则将删除所有行。执行 DELETE 操作后,您需要 COMMIT 或 ROLLBACK 事务以使更改永久化或撤消它。请注意,此操作将触发表上的所有 DELETE 触发器。删除时会添加行级锁。

发件人:http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

【讨论】:

对我这样的初学者来说很好的解释 又短又甜【参考方案4】:

所有好的答案,我必须补充:

由于 TRUNCATE TABLE 是 DDL (Data Defination Language),而不是 DML (Data Manipulation Langauge) 命令,因此 Delete Triggers 不会运行。

【讨论】:

啊,触发器......这是一个好点。如果可以的话,我会把它添加到我制作的列表中,并感谢 Polara。 SQL Server 不允许您截断带有外键的表,因此您的级联点可能没有实际意义,具体取决于平台。 PostgreSQL 有一个“TRUNCATE 触发器”【参考方案5】:

SQL Server 中删除与截断的总结 如需完整文章,请点击此链接:http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/

取自 dotnet mob 文章:Delete Vs Truncate in SQL Server

【讨论】:

【参考方案6】:

对于 SQL Server 或 mysql,如果有一个自动递增的 PK,truncate 将重置计数器。

【讨论】:

澄清一下,如果表有一个定义为 IDENTITY 的列,这适用于 SQL Server。 Delete 会保留最后一个自动分配的 ID,而 Truncate 会重置计数器。 由于这个问题被标记为 ORACLE,所以这个答案是错误的,因此被否决了。 糟糕,没有看到 oracle 标记 :) +1 true,并将其重置为 0。如果您希望它改为 1DBCC CHECKIDENT (table_name, RESEED, 1) 我已将此添加到社区答案中,并使其对记录供应商特定问题更加友好【参考方案7】:

截断

TRUNCATE SQL 查询从表中删除所有行,而不记录单个行删除。

TRUNCATE 是一个 DDL 命令。 TRUNCATE 使用表锁执行,整个表被锁定 删除所有记录。 我们不能将 WHERE 子句与 TRUNCATE 一起使用。 TRUNCATE 删除表中的所有行。 事务日志中的日志记录最少,因此性能更快。 TRUNCATE TABLE 通过解除分配使用的数据页来删除数据 存储表数据并仅记录页面释放 事务日志。 要对表使用截断,您至少需要对表的 ALTER 权限 表。 Truncate 使用的事务空间比 Delete 语句少。 截断不能用于索引视图。 TRUNCATE 比 DELETE 快。

删除

要执行 DELETE 队列,需要对目标表具有删除权限。如果您需要在 DELETE 中使用 WHERE 子句,则还需要选择权限。

DELETE 是一个 DML 命令。 DELETE 使用行锁执行,表中的每一行都被锁定 删除。 我们可以使用带 DELETE 的 where 子句来过滤和删除特定的 记录。 DELETE 命令用于根据 WHERE 从表中删除行 条件。 它维护日志,所以它比 TRUNCATE 慢。 DELETE 语句一次删除一行并记录一个条目 在每个已删除行的事务日志中。 标识列保持 DELETE 保留标识。 要使用 Delete,您需要对表具有 DELETE 权限。 Delete 使用比 Truncate 语句更多的事务空间。 删除可用于索引视图。

【讨论】:

【参考方案8】:

“截断不记录任何内容”是正确的。我会更进一步:

截断不在事务上下文中执行。

截断相对于删除的速度优势应该是显而易见的。根据您的情况,这种优势从微不足道到巨大。

但是,我看到 truncate 无意中破坏了参照完整性,并违反了其他约束。您通过在事务之外修改数据获得的权力必须与您在无网走钢丝时继承的责任相平衡。

【讨论】:

【参考方案9】:

TRUNCATE 是 DDL 语句,而 DELETE 是 DML 语句。以下是两者之间的区别:

    由于 TRUNCATE 是 DDL (Data definition language) 语句,它不需要提交即可使更改永久化。这就是为什么 truncate 删除的行无法回滚的原因。另一方面,DELETE 是 DML (Data manipulation language) 语句,因此需要显式提交才能使其效果永久化。

    TRUNCATE 总是从表中删除所有行,使表为空且表结构完整,而DELETE 可以在使用 where 子句时有条件地删除。

    TRUNCATE TABLE语句删除的行无法恢复,TRUNCATE语句中不能指定where子句。

    TRUNCATE 语句不会触发触发器,而不是 DELETE 语句上的删除触发器

Here 是与主题相关的非常好的链接。

【讨论】:

【参考方案10】:

是的,DELETE 比较慢,TRUNCATE 比较快。为什么?

DELETE 必须读取记录、检查约束、更新块、更新索引以及生成重做/撤消。所有这些都需要时间。

TRUNCATE 只是为表(高水位线)调整数据库中的指针,然后噗!数据不见了。

这是 Oracle 特定的,AFAIK。

【讨论】:

PostgreSQL 也类似。【参考方案11】:

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

以下相关信息来自a blog post:

在处理数据库时,我们使用 Delete 和 Truncate without 知道它们之间的区别。在本文中,我们将讨论 Sql中Delete和Truncate的区别。

删除:

删除是一个 DML 命令。 删除语句使用行锁执行,表中的每一行都被锁定以进行删除。 我们可以在 where 子句中指定过滤器。 如果条件存在则删除指定的数据。 删除活动触发器,因为操作是单独记录的。 比截断慢,因为它保留日志

截断

截断是一个 DDL 命令。 截断表总是锁定表和页,而不是每一行。因为它会删除所有数据。 不能使用 Where 条件。 它会删除所有数据。 截断表无法激活触发器,因为该操作不记录单个行删除。 性能更快,因为它不保留任何日志。

注意:Delete 和 Truncate 都可以在使用时回滚 交易。如果事务完成,意味着已提交,那么我们不能 rollback 截断命令,但我们仍然可以回滚删除命令 来自日志文件,因为删除写入将它们记录在日志文件中,以防万一 以后需要从日志文件中回滚。

如果你有一个外键约束引用你所在的表 试图截断,即使引用表没有 里面的数据。这是因为外键检查是使用 DDL 完成的 而不是 DML。这可以通过暂时禁用 表的外键约束。

删除表是一个记录操作。所以每一行的删除得到 记录在事务日志中,这使得它变慢了。截断表 还会删除表中的所有行,但不会记录删除 相反,它记录每一行的数据页的释放 表,这使它更快。

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

【讨论】:

感谢@Lucas:他内联了内容。我只是把它放在一个引用中,以表明它来自不同的来源。【参考方案12】:

这是我对the difference between DELETE and TRUNCATE in SQL Server的详细回答

删除数据:首先,两者都可用于从表中删除行。 但 DELETE 不仅可用于从表中删除行,还可以从 VIEW 或 OPENROWSET 或 OPENQUERY 的结果中删除行,这取决于提供者的能力。

FROM 子句:使用 DELETE,您还可以使用另一个 FROM 子句根据另一个表中的行从一个表/视图/rowset_function_limited 中删除行。在该 FROM 子句中,您还可以编写正常的 JOIN 条件。实际上,您可以通过将 SELECT 替换为 DELETE 并删除列名,从不包含任何聚合函数的 SELECT 语句创建 DELETE 语句。 使用 TRUNCATE,您无法做到这一点。

WHERE:TRUNCATE 不能有 WHERE 条件,但 DELETE 可以。这意味着使用 TRUNCATE 不能删除特定行或特定行组。 TRUNCATE TABLE 类似于没有 WHERE 子句的 DELETE 语句。

性能:TRUNCATE TABLE 速度更快,使用的系统和事务日志资源更少。 原因之一是任一语句使用的锁。 DELETE 语句使用行锁执行,表中的每一行都被锁定以进行删除。 TRUNCATE TABLE 总是锁定表和页,而不是每一行。

事务日志:DELETE 语句一次删除一行,并在事务日志中为每一行创建单独的条目。 TRUNCATE TABLE 通过解除分配用于存储表数据的数据页来移除数据,并且仅在事务日志中记录页解除分配。

Pages :执行DELETE 语句后,表仍可以包含空页。 TRUNCATE 通过释放用于存储表数据的数据页来删除数据。

触发器:TRUNCATE 不会激活表上的删除触发器。所以在使用 TRUNCATE 时必须非常小心。如果在表上定义了删除触发器以在删除行时执行一些自动清理或记录操作,则永远不应使用 TRUNCATE。

标识列:如果表包含标识列,则使用 TRUNCATE,该列的计数器将重置为为该列定义的种子值。如果没有定义种子,则使用默认值 1。 DELETE 不会重置身份计数器。因此,如果您想保留身份计数器,请改用 DELETE。

复制:DELETE 可用于事务复制或合并复制中使用的表。 而 TRUNCATE 不能用于事务复制或合并复制中涉及的表。

回滚:DELETE 语句可以回滚。 TRUNCATE 也可以回滚,前提是它包含在 TRANSACTION 块中并且会话未关闭。会话关闭后,您将无法回滚 TRUNCATE。

限制:如果 DELETE 语句违反触发器或尝试删除具有 FOREIGN KEY 约束的另一个表中的数据引用的行,则它可能会失败。如果 DELETE 删除了多行,并且任何被删除的行违反了触发器或约束,则取消该语句,返回一个错误,并且不删除任何行。 如果对 View 使用 DELETE,则该 View 必须是可更新的视图。 TRUNCATE 不能用于索引视图中使用的表。 TRUNCATE 不能用于由 FOREIGN KEY 约束引用的表,除非表具有引用自身的外键。

【讨论】:

嗨 Mangal -- 感谢您的回答,特别是针对 SQL*Server 特定问题。你认为你可以将这些观点与被接受的社区 Wiki 答案结合起来吗? 是的,但是如何以及在哪里?对不起,我是新来的。 “所以如果你想保留身份计数器,使用DELETE”你可以使用DECLARE @ai as bigintSET @ai =IDENT_CURRENT('tablename')TRUNCATE TABLE tablenameDBCC checkident('tablename', RESEED, @ai)【参考方案13】:

在 SQL Server 2005 中,我相信您可以回滚截断

【讨论】:

【参考方案14】:

删除

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

截断

TRUNCATE 从表中删除所有行。该操作无法回滚,也不会触发任何触发器。因此,TRUCATE 速度更快,并且不像 DELETE 那样使​​用太多的撤消空间。

丢弃

DROP 命令从数据库中删除一个表。所有表的行、索引和权限也将被删除。不会触发任何 DML 触发器。该操作无法回滚。


DROP 和 TRUNCATE 是 DDL 命令,而 DELETE 是 DML 命令。因此 DELETE 操作可以回滚(撤消),而 DROP 和 TRUNCATE 操作不能回滚。

发件人:http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

【讨论】:

这是否会为当前的答案添加一些内容?【参考方案15】:

如果包裹在事务中,TRUNCATE 可以回滚。

请参阅下面的两个参考并测试自己:-

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE 与 DELETE 是 SQL 面试中臭名昭著的问题之一。只要确保你正确地向面试官解释它,否则它可能会让你失去工作。问题是没有多少人知道,所以如果你告诉他们 YES Truncate 可以回滚,他们很可能会认为答案是错误的。

【讨论】:

【参考方案16】:

这两个操作的另一个区别是,如果表包含一个标识列,则该列的计数器在 TRUNCATE 下重置为 1(或为该列定义的种子值)。 DELETE 没有这种影响。

【讨论】:

【参考方案17】:

对原始答案的小修正 - 删除也会产生大量重做(因为撤消本身受重做保护)。这可以从自动跟踪输出中看出:

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed

【讨论】:

它的旧线程,但根据我的理解,截断只会生成大量的重做日志,而删除会同时生成撤消和重做。【参考方案18】:

删除

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax – Delete from [Table] where [Condition]

截断

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax – Truncate table [Table]

更多详情请访问

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/

【讨论】:

【参考方案19】:

最大的区别是 truncate 是非记录操作,而 delete 是。

简单地说,就是在数据库崩溃的情况下,你无法恢复被 truncate 操作的数据,但使用 delete 可以。

更多详情here

【讨论】:

【参考方案20】:

DELETE 语句:此命令根据 where 子句中给出的条件仅删除表中的行,如果未指定条件,则删除表中的所有行。但它不会释放包含表格的空间。

SQL DELETE 语句的语法是:

DELETE FROM table_name [WHERE 条件];

TRUNCATE 语句:该命令用于从表中删除所有行并释放包含该表的空间。

【讨论】:

【参考方案21】:

简而言之,truncate 不会记录任何内容(因此速度更快但无法撤消),而 delete 会记录(并且可以是更大事务的一部分,将回滚等)。如果您在 dev 的表中有不需要的数据,通常最好截断,因为您不会冒填满事务日志的风险

【讨论】:

【参考方案22】:

它很方便的一个重要原因是,当您需要刷新数百万行表中的数据,但又不想重建它时。 “删除 *” 会花费很长时间,而 Truncate 的性能影响可以忽略不计。

【讨论】:

【参考方案23】:

无法通过 dblink 执行 DDL。

【讨论】:

【参考方案24】:

我想对 matthieu 的帖子发表评论,但我还没有代表...

在 MySQL 中,自动递增计数器会通过 truncate 重置,但不会通过 delete 重置。

【讨论】:

【参考方案25】:

truncate 并不是在 SQL Server 中不记录任何内容。 truncate 不会记录任何信息,但会记录您触发 TRUNCATE 的表的数据页释放。

如果我们在开始时定义事务,则可以回滚被截断的记录,并且可以在回滚后恢复被截断的记录。但在提交截断事务后,无法从事务日志备份中恢复截断记录。

【讨论】:

【参考方案26】:

此处的截断也可以回滚

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

【讨论】:

【参考方案27】:

SQL中的Truncate和Delete是两个用于从表中删除或删除数据的命令。尽管在本质上非常基本,但在使用之前熟悉细节之前,这两个 Sql 命令都会产生很多麻烦。 如果需要删除太多数据而日志段不够用,则命令选择不正确可能会导致进程非常缓慢,甚至会炸毁日志段。这就是为什么知道何时在 SQL 中使用 truncate 和 delete 命令至关重要,但在使用这些命令之前,您应该了解 Truncate 和 Delete 之间的差异,并基于它们,我们应该能够找出 DELETE 何时是删除的更好选择应该使用 data 或 TRUNCATE 来清除表。

参考检查click here

【讨论】:

【参考方案28】:

通过发出 TRUNCATE TABLE 语句,您是在指示 SQL Server 删除表中的每条记录,而不进行任何日志记录或事务处理。

【讨论】:

【参考方案29】:

DELETE 语句可以有一个 WHERE 子句来删除特定的记录,而 TRUNCATE 语句不需要任何并擦除整个表。 重要的是,DELETE 语句记录删除日期,而 TRUNCATE 语句不记录。

【讨论】:

【参考方案30】:

另一个特定于 microsoft sql server 的区别是 delete 您可以使用 output 语句来跟踪已删除的记录,例如:

delete from [SomeTable]
output deleted.Id, deleted.Name

truncate 无法做到这一点。

【讨论】:

以上是关于SQL中的TRUNCATE和DELETE有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

truncate和delete有啥区别

Sql语句中的truncate,delete,drop的区别

SQL语句中的 truncate delete与drop区别

SQL语句中的 truncate delete与drop区别

SQL中truncate table和delete的区别

在sql server中truncate、delete、drop删除表的区别,详细点,越详细越好。