![]() |
1
291
这里列出了一些不同之处。我强调了Oracle特有的功能,希望社区也能加入其他供应商特有的差异。大多数供应商常见的差异可以直接放在标题下方,下面突出显示差异。
如果您想快速删除表中的所有行,并且确实确定要这样做,并且表中没有外键,那么截断可能比删除要快。
语句类型Delete是DML,Truncate是DDL( What is DDL and DML?
提交并回滚供应商变量
Truncate可以回滚。 PostgreSQL
神谕 因为TRUNCATE是DDL,所以它涉及两个提交,一个在语句执行之前,一个在语句执行之后。因此,Truncate无法回滚,并且Truncate进程中的失败将发出提交。 但是,请参见下面的倒叙。
空间复垦删除不恢复空间,截断恢复空间 神谕
行范围删除可用于删除所有行或仅删除行的子集。截断删除所有行。 神谕
对象类型Delete可以应用于表和集群内的表。Truncate仅适用于表或整个集群。(可能是特定于Oracle的)
神谕 删除不会影响数据对象id,但truncate会指定新的数据对象id 自创建表以来,从未对表进行过插入,即使是回滚的单个插入也会导致在截断时分配新的数据对象id。
闪回可以跨删除工作,但截断可以防止闪回到操作之前的状态。 但是,从11gR2开始,FLASHBACK归档功能允许这样做,Express Edition除外 Use of FLASHBACK in Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
特权变量 神谕
重做/撤消
索引神谕 截断操作使不可用的索引再次可用。删除不会删除。
外键当启用的外键引用表时,无法应用截断。使用delete进行处理取决于外键的配置。
表锁定
Truncate需要独占表锁,delete需要共享表锁。因此,禁用表锁是防止对表执行截断操作的一种方法。
触发DML触发器不会在截断时触发。
DDL触发器可用。
远程执行
不能通过数据库链接发出Truncate。
标识列
Truncate重置标识列类型的序列,delete不重置。
结果集
e、 g.在Oracle PL/SQL子程序中,您可以:
|
![]() |
2
212
|
![]() |
3
65
http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands |
![]() |
4
24
所有好答案,我必须补充:
自从
|
![]() |
5
22
SQL server中删除与截断的概述
摘自dotnet暴徒文章: Delete Vs Truncate in SQL Server |
![]() |
6
20
对于SQL Server或MySQL,如果有自动递增的PK,truncate将重置计数器。 |
![]() |
7
18
TRUNCATE SQL查询删除表中的所有行,而不记录单个行的删除。
删去
|
![]() |
8
12
Truncate不会在事务上下文中执行。
然而,我看到truncate无意中破坏了引用完整性,并违反了其他约束。在事务之外修改数据所获得的力量必须与在没有网络的情况下走钢丝时所继承的责任相平衡。 |
![]() |
9
10
Here 是与主题相关的非常好的链接。 |
![]() |
10
8
是的,删除速度较慢,截断速度较快。为什么?
|
![]() |
11
6
如果您意外地使用Delete/Truncate从表中删除了所有数据。您可以回滚已提交的事务。恢复上次备份并运行事务日志,直到即将发生删除/截断。 以下相关信息来自 a blog post :
|
![]() |
12
5
以下是我对这个问题的详细回答 the difference between DELETE and TRUNCATE in SQL Server
删除数据
:首先,两者都可用于从表中删除行。
:使用DELETE,您还可以使用另一个from子句根据另一个表中的行删除一个表中的行/view/rowset\U function\U limited。在FROM子句中,您还可以编写正常连接条件。实际上,您可以通过将SELECT替换为DELETE并删除列名,从不包含任何聚合函数的SELECT语句创建DELETE语句。
哪里 :截断不能具有WHERE条件,但删除可以。这意味着使用TRUNCATE无法删除特定行或特定行组。 ⢠表演 :TRUNCATE TABLE更快,使用更少的系统和事务日志资源。
â¢
事务日志
:DELETE语句一次删除一行,并在事务日志中为每行创建单独的条目。
页 :执行DELETE语句后,表仍然可以包含空页。
标识列 删除不会重置标识计数器。因此,如果要保留标识计数器,请改用DELETE。
:DELETE可用于事务复制或合并复制中使用的表。
â¢
回降
限制
:如果外键引用了另一个表中的数据约束,则尝试删除该约束可能会失败。如果DELETE删除了多行,并且删除的行中的任何一行违反了触发器或约束,则该语句将被取消,返回错误,并且不会删除任何行。
|
![]() |
13
4
在SQLServer2005中,我相信您 回滚截断 |
![]() |
14
4
http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands |
![]() |
15
3
如果包装在事务中,则可以回滚TRUNCATE。
TRUNCATE与DELETE是SQL访谈中臭名昭著的问题之一。只要确保你能向面试官解释清楚,否则你可能会失去这份工作。问题是没有多少人知道,所以如果你告诉他们答案是可以截断的话,他们很可能会认为答案是错误的。 |
![]() |
16
3
这两个操作的另一个区别是,如果表包含标识列,则该列的计数器在TRUNCATE下重置为1(或为该列定义的种子值)。删除不具有此影响。 |
![]() |
17
2
|
![]() |
18
2
删去
截断
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/ |
![]() |
20
1
DELETE语句:此命令根据where子句中给定的条件仅删除表中的行,如果未指定条件,则删除表中的所有行。但它不会释放包含表的空间。
从表_中删除名称[其中条件]; TRUNCATE语句:此命令用于删除表中的所有行,并释放包含表的空间。 |
![]() |
21
0
简而言之,truncate不会记录任何内容(因此速度更快,但无法撤消),而delete会记录(并且可以是更大事务的一部分,将回滚等)。如果您在dev中的表中有不需要的数据,则通常最好将其截断,因为您不必冒填充事务日志的风险 |
![]() |
22
0
它很方便的一个重要原因是,当您需要刷新数百万行表中的数据,但又不想重建它时。“Delete*”将花费很长时间,而Truncate的性能影响可以忽略不计。 |
![]() |
23
0
无法通过数据库链接执行DDL。 |
![]() |
24
0
我想对matthieu的帖子发表评论,但我还没有这个代表。。。
|
![]() |
25
0
这并不是说truncate不在SQL Server中记录任何内容。truncate不会记录任何信息,但会记录触发truncate的表的数据页解除分配。 如果我们在开始时定义了事务,并且可以在回滚被截断的记录后恢复它,则可以回滚被截断的记录。但在提交截断事务后,无法从事务日志备份中恢复截断的记录。 |
![]() |
26
0
Truncate也可以在这里回滚
|
![]() |
27
0
参考检查 click here |
![]() |
28
0
通过发出TRUNCATE TABLE语句,可以指示SQL Server删除表中的每条记录,而不进行任何日志记录或事务处理。 |
![]() |
29
0
DELETE语句可以有一个WHERE子句来删除特定的记录,而TRUNCATE语句不需要任何记录,并且会擦除整个表。 |
![]() |
30
0
microsoft sql server特有的另一个区别是
你不能这样做
|
![]() |
blogger13 · 视频租赁店数据库的规范化 4 月前 |
![]() |
ì¤ì¤í · 为什么LEFT INNER JOIN被弃用? 5 月前 |
![]() |
relatively_random · 确保两个表之间一致的共同参考 6 月前 |
|
Grenish Rai · Firestore错误“用户文档不存在” 9 月前 |
![]() |
Saijo-Shi · PLpgsql中的更新触发器 9 月前 |
![]() |
Dante · Django::配置不当:池不支持持久连接 9 月前 |
![]() |
YouLocalRUser · 删除重复行,保留第一行 10 月前 |