Skip to content

SQLite - 删除查询

SQLite DELETE 查询用于从表中删除现有记录。它是 SQL 中最强大且可能最具破坏性的命令之一,因此必须谨慎使用。

你几乎总是将 WHERE 子句与 DELETE 查询一起使用,以指定要删除的行。如果你省略 WHERE 子句,表中的所有记录都将被删除!

带有 WHERE 子句的 DELETE 查询的基本语法是:

DELETE FROM table_name
WHERE [condition];

[condition] 的工作方式与 SELECT 语句完全相同,允许你使用 AND 或 OR 运算符组合多个条件,以精确地定位要删除的记录。

让我们使用前几章中的 EMPLOYEES 表。首先,看看它当前的状态:

sqlite> SELECT * FROM EMPLOYEES;
ID NAME AGE DEPARTMENT SALARY
-- ------ --- ---------- -------
1 David 27 IT 85000.0
2 Allen 25 HR 15000.0
3 Martin 23 Finance 20000.0
4 Mark 25 IT 65000.0
5 Paul 32 Finance 21000.0
6 Kim 22 HR 45000.0
7 James 24 Marketing 10000.0

现在,我们来删除 ID 为 7 的员工。

sqlite> DELETE FROM EMPLOYEES WHERE ID = 7;

执行该命令后,表将包含以下记录:

sqlite> SELECT * FROM EMPLOYEES;
ID NAME AGE DEPARTMENT SALARY
-- ------ --- ---------- -------
1 David 27 IT 85000.0
2 Allen 25 HR 15000.0
3 Martin 23 Finance 20000.0
4 Mark 25 IT 65000.0
5 Paul 32 Finance 21000.0
6 Kim 22 HR 45000.0

要从 EMPLOYEES 表中删除所有记录,你可以执行不带 WHERE 子句的 DELETE 查询:

-- 警告:这将从表中删除所有数据。
sqlite> DELETE FROM EMPLOYEES;

此操作后,SELECT * FROM EMPLOYEES; 将不返回任何行。请注意,此操作不会删除表本身,只删除其内容。表结构仍然存在。

删除所有行时,此命令会为每行触发 DELETE 触发器。如果你想快速清空表且不需要触发器运行,一种更快(但非标准)的方法是 TRUNCATE TABLE,在 SQLite 中,这通常通过 DELETE 和手动重置自增计数器(如果存在)来模拟实现。

鉴于 DELETE 的永久性,专业人士会遵循严格的安全措施:

这是最重要的最佳实践。在运行 DELETE 命令之前,先编写一个带有完全相同 WHERE 子句的 SELECT 语句。这允许你预览将被删除的确切行集,从而防止灾难性的错误。

-- 步骤 1:预览要删除的行
sqlite> SELECT * FROM EMPLOYEES WHERE DEPARTMENT = 'HR';
ID NAME AGE DEPARTMENT SALARY
-- ----- --- ---------- -------
2 Allen 25 HR 15000.0
6 Kim 22 HR 45000.0
-- 步骤 2:如果预览正确,执行 DELETE
sqlite> DELETE FROM EMPLOYEES WHERE DEPARTMENT = 'HR';

执行高风险操作时,请将其封装在事务(transaction)中。事务允许你在犯错时撤销更改。你可以在使用 COMMIT 提交更改使其永久生效之前,或使用 ROLLBACK 放弃更改之前,先查看这些更改。

sqlite> BEGIN TRANSACTION;
-- 执行删除操作
sqlite> DELETE FROM EMPLOYEES WHERE AGE < 25;
-- 此时,你可以运行 SELECT 来检查表的状态
sqlite> SELECT * FROM EMPLOYEES;
-- 如果你犯了错误,可以撤销它!
sqlite> ROLLBACK;
-- 或者,如果一切正确,使其永久生效
sqlite> COMMIT;