SQL Delete
SQL DELETE 语句
Section titled “SQL DELETE 语句”SQL 中的 DELETE 语句用于从表中删除现有的记录(行)。这是一个强大的命令,因此必须谨慎使用。
SQL DELETE 语句解释
Section titled “SQL DELETE 语句解释”DELETE 语句根据指定的条件从表中删除一行或多行。如果未提供条件,则表中的所有行将被删除。
SQL DELETE 语法
Section titled “SQL DELETE 语法”DELETE FROM table_name WHERE condition;
table_name:要从中删除行的表的名称。WHERE condition:一个可选子句,用于指定要删除哪些行。如果省略,则删除所有行。
让我们使用一个概念性的“Customers”(客户)表作为示例。
“Customers”表的初始数据:
| CustomerID | CustomerName | ContactName | City | Country |
|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Berlin | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | México D.F. | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | México D.F. | Mexico |
| 4 | Around the Horn | Thomas Hardy | London | UK |
| 5 | Berglunds snabbköp | Christina Berglund | Luleå | Sweden |
SQL DELETE 示例
Section titled “SQL DELETE 示例”假设我们想从“Customers”表中删除客户“Alfreds Futterkiste”。最佳实践是使用唯一的标识符,如 CustomerID(如果可用)。
使用 CustomerID(推荐):
DELETE FROM CustomersWHERE CustomerID = 1;使用 CustomerName(如果 CustomerID 未知,但小心重复项):
DELETE FROM CustomersWHERE CustomerName = 'Alfreds Futterkiste';执行其中一条语句后,“Customers”表将如下所示(假设 CustomerID 1 是 ‘Alfreds Futterkiste’):
| CustomerID | CustomerName | ContactName | City | Country |
|---|---|---|---|---|
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | México D.F. | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | México D.F. | Mexico |
| 4 | Around the Horn | Thomas Hardy | London | UK |
| 5 | Berglunds snabbköp | Christina Berglund | Luleå | Sweden |
删除表中的所有行
Section titled “删除表中的所有行”要删除表中的所有行而不删除表本身(即表结构、列、索引和约束保持不变),可以使用不带 WHERE 子句的 DELETE:
DELETE FROM table_name;
建议极其谨慎使用此命令。
替代方案:TRUNCATE TABLE
Section titled “替代方案:TRUNCATE TABLE”许多数据库系统提供了 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)。