![]() |
1
82
但是,如果您在事务中并且希望能够“撤消”此删除,则需要使用
编辑: 请注意,上述内容对于SQL Server不正确(但它确实适用于Oracle)。在SQL Server中,如果您在事务内部并且事务尚未提交,则可以回滚截断操作。从SQL Server的角度来看,delete-from和truncate之间的一个关键区别是 this : “DELETE语句一次删除一行,并在事务日志中为每个已删除行记录一个条目。truncate table通过取消分配用于存储表数据的数据页来删除数据,并且只在事务日志中记录页取消分配。” 换句话说,由于在事务日志中只记录页面释放,因此在截断期间日志记录较少,而在记录每一行的删除操作时,日志记录较少。这就是截短速度极快的原因之一。 还请注意,从该msdn链接,您不能截断外键约束引用的表、参与索引视图或使用事务复制或合并复制发布的表。 编辑2: 另一个关键点是,truncate表将把您的标识重置为初始种子,而delete-from将从它停止的位置继续递增。 参考:本·罗宾逊的答案。 |
![]() |
2
46
其他答案中没有提到的另一个关键点是
|
![]() |
3
8
从安全性的角度来看,另一个区别是截断需要表上的alter特权,而删除只需要该表上的(drum roll)删除权限。 |
![]() |
4
4
|
![]() |
5
3
SQL Server中删除与截断的大纲 有关此连接之后的完整文章,请执行以下操作: delete vs truncate in sql server 截断-语法*/ 截断表表名 /*删除-语法*/ 从表名称中删除 在什么情况下 < /代码>
|
|
6
2
我相信只有在显式事务中执行操作时,删除和截断才能回滚。否则,必须执行还原以恢复删除的数据 |
![]() |
7
1
根本区别在于它们的记录方式。删除和截断的记录方式不同,但可以以完全相同的方式回滚。记录所有更改数据的操作。在SQL Server中,没有非日志操作。 |
![]() |
8
0
有一件事非常重要(IMO),其他答案中没有提到
现在假设在这个查询开始的1-2分钟后,我们尝试执行以下操作:
注意我用过
这也会持续5个小时。但是,如果你换了那个
|
![]() |
9
0
另一个区别是
例如:
将以错误结束:
同时
|
![]() |
10
0
加上所有的答案,另一个需要考虑的问题是
|
|
11
-1
|
![]() |
12
-2
truncate不做任何日志记录,delete做任何日志记录,所以如果您有大量的记录,那么您的trans日志是巨大的。 |
![]() |
Matt · MySQL-基于列子集重复项删除行 7 年前 |
|
user9324656 · Php删除函数javascript/重定向 7 年前 |
![]() |
SaadH · SQL:如何根据条件从表中删除行 7 年前 |
![]() |
Ivan Gerasimenko · 带内部连接的删除查询无限执行 8 年前 |
![]() |
Michal Palus · 基于选择删除 8 年前 |
|
zsh5032 · 删除Sqlite表中的行 8 年前 |