目录
Truncate和Delete之间的区别是什么?
何时使用TRUNCATE
何时使用DELETE命令
结论
在SQL Server中,有几种方法可以从表中删除行。您可以使用TRUNCATE和DELETE命令。虽然两个命令的最终结果是相同的,但您应该了解一下它们之间非常重要的差异。
Truncate和Delete之间的区别是什么?TRUNCATE命令类似于DELETE命令,没有WHERE子句,安全网的数量少得多。
何时使用TRUNCATE当TRUNCATE表时,会记录较少的信息。这意味着TRUNCATE语句执行速度非常快;但是,它是以不记录每行被删除为代价的。这意味着,在使用命令时需要非常小心(实际上也要小心DELETE!)。
虽然您可以在SQL Server中回滚TRUNCATE命令,但在Oracle中无法执行相同的操作。
TRUNCATE命令很简单但非常危险。以下是从employee表中删除所有行的示例:
TRUNCATE TABLE employee
如果您错误地执行了TRUNCATE语句,则恢复起来要困难得多,并且您可能会在此过程中丢失数据。TRUNCATE命令会记录它删除的页面,因此可以使用一些高级代码恢复页面。
以下是使用TRUNCATE的一些原因:
- 您希望将表“重置”为空状态。将删除所有行,并将标识键值重置为初始定义的值。
- 您需要以超快速的方式清除表数据。当您需要重复导入测试数据或者您有使用工作表或临时表来存储信息的例程时,我可以看到这种情况。
- 您希望从表中删除行而不激活删除后的表触发器。
请记住,TRUNCATE将锁定表,因此显然的,不要在许多并发用户共享的表上使用此命令。
何时使用DELETE命令DELETE命令用于从数据库中删除记录。这是最常见的方式。在最简单的形式中,您可以从数据库中删除所有行,或者可以添加WHERE子句以仅删除符合条件的行。
执行DELETE命令时,DBMS会记录所有已删除的行。这意味着比错误中TRUNCATE更容易从错误中恢复。
命令
DELETE FROM employee
将从员工表中删除所有员工;然而,
DELETE FROM employee
WHERE firstName = ‘Kris’
删除名字为Kris的所有员工。
我建议在所有情况下使用DELETE语句,除了那些值得TRUNCATE的特殊情况。
以下是在DELETE期间发生而在TRUNCATE期间不发生的一些事情:
- 在受影响的表上执行任何删除触发器。
- 您可以删除已定义外键约束的记录。如果存在相同的约束,则无法执行TRUNCATE。
- 记录删除不会重置身份密钥。当您需要保证每一行使用之前从未使用过的密钥时,这一点很重要。也许,这需要出于审计原因。
- 根据您使用的锁定,行锁定位于已删除的已删除行上。未受影响的行保持解锁状态。
我应该指出TRUNCATE被认为是DDL命令;而DELETE是DML命令。我认为这种区别应该有助于您进一步了解何时使用任何一个命令以及这样做的含义。
简而言之,使用DELETE从表中删除一行或多行。只有在特殊情况下,例如当您需要将表重置为其初始状态时才应考虑TRUNCATE。