Skip to content

SQL Delete

SQL 中的 DELETE 语句用于从表中删除现有的记录(行)。这是一个强大的命令,因此必须谨慎使用。

DELETE 语句根据指定的条件从表中删除一行或多行。如果未提供条件,则表中的所有行将被删除。

DELETE FROM table_name WHERE condition;

  • table_name:要从中删除行的表的名称。
  • WHERE condition:一个可选子句,用于指定要删除哪些行。如果省略,则删除所有行。

让我们使用一个概念性的“Customers”(客户)表作为示例。

“Customers”表的初始数据:

CustomerIDCustomerNameContactNameCityCountry
1Alfreds FutterkisteMaria AndersBerlinGermany
2Ana Trujillo Emparedados y heladosAna TrujilloMéxico D.F.Mexico
3Antonio Moreno TaqueríaAntonio MorenoMéxico D.F.Mexico
4Around the HornThomas HardyLondonUK
5Berglunds snabbköpChristina BerglundLuleåSweden

假设我们想从“Customers”表中删除客户“Alfreds Futterkiste”。最佳实践是使用唯一的标识符,如 CustomerID(如果可用)。

使用 CustomerID(推荐):

DELETE FROM Customers
WHERE CustomerID = 1;

使用 CustomerName(如果 CustomerID 未知,但小心重复项):

DELETE FROM Customers
WHERE CustomerName = 'Alfreds Futterkiste';

执行其中一条语句后,“Customers”表将如下所示(假设 CustomerID 1 是 ‘Alfreds Futterkiste’):

CustomerIDCustomerNameContactNameCityCountry
2Ana Trujillo Emparedados y heladosAna TrujilloMéxico D.F.Mexico
3Antonio Moreno TaqueríaAntonio MorenoMéxico D.F.Mexico
4Around the HornThomas HardyLondonUK
5Berglunds snabbköpChristina BerglundLuleåSweden

要删除表中的所有行而不删除表本身(即表结构、列、索引和约束保持不变),可以使用不带 WHERE 子句的 DELETE:

DELETE FROM table_name;

建议极其谨慎使用此命令。

许多数据库系统提供了 TRUNCATE TABLE 命令,作为一种更快的方法来删除表中的所有行。

TRUNCATE TABLE table_name;

DELETE FROM table_name; 和 TRUNCATE TABLE table_name; 之间的主要区别:

  • 速度:TRUNCATE 通常快得多,因为它直接释放数据页,并且记录的信息较少。
  • 触发器 (Triggers):DELETE 会触发行级 DELETE 触发器。TRUNCATE 通常不会(行为可能因 RDBMS 而异)。
  • 事务日志 (Transaction Log):DELETE 记录每行删除,这可能会填满事务日志。TRUNCATE 记录页的释放,使用更少的资源。
  • 自动递增 (Auto-increment):TRUNCATE 通常会将自动递增的标识列重置为其起始值。DELETE 不会。
  • 回滚 (Rollback):DELETE 是一个 DML 命令,可以在事务内回滚。TRUNCATE 通常被视为 DDL 命令(或具有类 DDL 特性的 DML),其回滚行为可能有所不同;某些 RDBMS 不允许回滚或处理方式不同。
  • WHERE 子句:TRUNCATE 不能有 WHERE 子句;它总是删除所有行。

当您需要快速清空表,且副作用(如不触发触发器或重置标识列)可以接受或期望时,请选择 TRUNCATE。对于条件删除或需要行级操作时,请使用 DELETE。

  • 除非您打算删除所有行,否则始终使用 WHERE 子句。
  • 优先在 WHERE 子句中使用主键(primary keys)或唯一标识符(unique identifiers)进行精确删除。
  • 先使用 SELECT 语句测试您的 WHERE 条件,以确保您定位到正确的行。
  • 在执行大规模删除操作之前,确保您有最近的数据库备份。
  • 如果您需要将多个相关的 DELETE 操作作为一个原子单元(atomic unit)执行,请考虑使用事务(transactions)。