课程 8.3: DELETE 语句
在上一课中,我们学习了如何使用 UPDATE 修改记录。现在让我们看看如何使用 DELETE 语句 删除不必要或过时的行。这是一个重要的 DML 命令,应该特别小心使用,因为被删除的数据并不总是能够轻易恢复。
基本语法
DELETE FROM table_name
WHERE condition;
DELETE FROM table_name— 指定将从中删除行的表。WHERE condition— 确定将删除哪些行。
如果省略 WHERE,表中的 所有行 都将被删除。
重要规则
- 始终检查
WHERE子句: 条件中的错误可能会删除错误的数据或过多的行。 - 先运行
SELECT: 在使用DELETE之前,最好先使用相同条件运行SELECT,确保结果正确。 - 表结构保持不变:
DELETE只删除数据,而不删除表本身或其列。 - 相关数据很重要: 如果定义了外键,数据库可能会阻止删除被其他表引用的行。
- 事务: 在生产系统中,重要的删除操作最好在事务中进行。
示例
示例 1:删除一行
让我们通过标识符删除一个客户:
DELETE FROM customer
WHERE customer_id = 1;
注意:由于 WHERE customer_id = 1,只有一行特定的记录将被删除。
示例 2:按条件删除多行
让我们删除在某个日期之前的付款记录:
DELETE FROM payment
WHERE payment_date < '2005-05-25';
结果:所有在指定日期之前的 payment 行将被删除。
示例 3:使用子查询删除
有时需要根据另一个表的条件删除行。例如,让我们删除由非活跃客户进行的付款:
DELETE FROM payment
WHERE customer_id IN (
SELECT customer_id
FROM customer
WHERE active = 0
);
结果:所有标记为非活跃的客户的付款将被删除。
示例 4:从表中删除所有行
如果需要完全清空一个表,可以在不使用 WHERE 的情况下使用 DELETE:
DELETE FROM temp_import;
注意:temp_import 表仍然存在,但其所有行将被删除。
删除前的检查
一个好的做法是先检查哪些行将受到影响:
-- 首先检查行
SELECT customer_id, first_name, last_name, active
FROM customer
WHERE active = 0;
-- 只有在验证后,运行 DELETE
DELETE FROM customer
WHERE active = 0;
这种方法有助于避免意外删除额外的数据。
DELETE 特别有用的情况
- 清理临时或测试数据;
- 按日期删除过时记录;
- 删除不再符合业务规则的行;
- 准备表以重新加载数据。
本课的关键要点:
DELETE从表中删除现有行。- 如果没有
WHERE,表中的 所有 行将被删除。 - 在删除之前,建议使用相同条件运行
SELECT。 DELETE保持表结构不变 — 仅删除数据。- 在重要场景中,使用事务和考虑外键更安全。