TRUNCATE,DELETE和DROP之间的区别是最常见的面试问题之一。这是它们之间的一些共同差异。
TRUNCATE
TRUNCATE SQL查询从表中删除所有行,且不记录单个行的删除日志。
下面的示例从“客户”表中删除所有数据。
TRUNCATE TABLE Customers;
- TRUNCATE是DDL命令
- TRUNCATE是使用表锁执行的,整个表都被锁定以删除所有记录。
- 不能将WHERE子句与TRUNCATE一起使用。
- TRUNCATE删除表中的所有行。
- 最小化事务日志中的日志记录,因此提高了性能。
- TRUNCATE TABLE通过取消分配用于存储表数据的数据页面来删除数据,并仅在事务日志中记录页面的解除分配。
- 如果表包含任何标识列,则将标识列重置为其种子值。
- 要在表上使用Truncate,您至少需要对该表具有ALTER权限。
- Truncate使用的事务空间比Delete语句少。
- Truncate不能与索引视图一起使用。
- TRUNCATE比DELETE快。
DELETE
要执行DELETE队列,需要对目标表具有删除权限。如果需要在DELETE中使用WHERE子句,则还需要选择权限。
以下查询从“客户”表中删除所有行。
DELETE FROM Customers;
GO
以下SQL查询从Orders大于1000的客户表中删除所有行。
DELETE FROM Customers WHERE OrderId > 1000;
GO
- DELETE是DML命令。
- 使用行锁执行DELETE,表中的每一行都被锁定以进行删除。
- 我们可以使用带DELETE的where子句来过滤和删除特定记录。
- DELETE命令用于根据WHERE条件从表中删除行。
- 它维护日志,因此比TRUNCATE慢。
- DELETE语句一次删除一行,并在事务日志中为每个删除的行记录一个条目。
- 列保持的标识DELETE保留该标识。
- 要使用DELETE,您需要在表上具有DELETE权限。
- DELETE使用比Truncate语句更多的事务空间。
- DELETE可以与索引视图一起使用。
DROP
DROP表查询将删除一个或多个表定义以及这些表的所有数据,索引,触发器,约束和权限规范。 DROP命令需要对该表所属的模式具有ALTER权限,对该表具有CONTROL权限或db_ddladmin固定数据库角色的成员身份。
以下SQL查询从当前数据库中删除“客户”表及其数据和索引。
DROP TABLE Customers ;
- DROP命令从数据库中删除表。
- 所有表的行,索引和特权也将被删除。
- 没有DML触发器将被触发。
- 操作无法回滚。
- DROP和TRUNCATE是DDL命令,而DELETE是DML命令。
- 可以回滚(删除)DELETE操作,而不能回滚DROP和TRUNCATE操作