在 SQL 中,DELETE
和 TRUNCATE
都用于从表中删除数据,但它们的工作方式不同,用途也不同。DELETE
是一种数据操作语言 (DML) 命令,它基于可选的 WHERE
子句一次删除一行。 如果没有提供 WHERE
条件,它会删除所有行,但它仍然会单独处理每一行,并记录每次删除。 这使得它对于大型数据集来说速度较慢。 相比之下,TRUNCATE
是一种数据定义语言 (DDL) 命令,它通过取消分配表使用的数据页来删除所有行。 此操作速度更快,因为它避免了逐行处理并最大限度地减少了日志记录。 但是,TRUNCATE
无法定位特定行,它总是清除整个表。
这些命令的事务行为和副作用也不同。DELETE
可以在事务中执行,允许在需要时回滚,并且它会触发在表上定义的任何 DELETE
触发器。 例如,如果您运行 DELETE FROM Employees WHERE Department = 'Sales'
,数据库会记录每个已删除的行,您可以使用 ROLLBACK
撤消该操作。 但是,TRUNCATE
在某些数据库系统(如不支持事务的 MySQL)中无法回滚,并且不会触发行级操作。 此外,TRUNCATE
将标识列(例如,自动递增 ID)重置为其种子值,而 DELETE
保留当前的标识值。 权限也不同:TRUNCATE
通常需要更高的权限,例如 ALTER TABLE
访问权限,而 DELETE
只需要标准的删除权限。
每个命令的用例取决于具体情况。 当您需要删除特定行或需要事务安全性时,请使用 DELETE
。 例如,删除用户的订单,同时保留他们的帐户信息。 当您需要快速清空一个大型表时,请使用 TRUNCATE
,例如重置一个临时数据集或暂存表。 但是,如果表被外键约束引用,TRUNCATE
将不起作用,而 DELETE
仍然可以删除行,只要约束得到遵守。 例如,TRUNCATE TABLE Logs
会立即清除该表,但 DELETE FROM Logs WHERE CreatedAt < '2023-01-01'
会有选择地删除较旧的条目。 选择正确的工具取决于平衡速度、粒度和事务需求。