SQLite - 删除查询
SQLite - DELETE 查询
Section titled “SQLite - DELETE 查询”SQLite DELETE 查询用于从表中删除现有记录。它是 SQL 中最强大且可能最具破坏性的命令之一,因此必须谨慎使用。
你几乎总是将 WHERE 子句与 DELETE 查询一起使用,以指定要删除的行。如果你省略 WHERE 子句,表中的所有记录都将被删除!
带有 WHERE 子句的 DELETE 查询的基本语法是:
DELETE FROM table_nameWHERE [condition];[condition] 的工作方式与 SELECT 语句完全相同,允许你使用 AND 或 OR 运算符组合多个条件,以精确地定位要删除的记录。
示例:删除特定记录
Section titled “示例:删除特定记录”让我们使用前几章中的 EMPLOYEES 表。首先,看看它当前的状态:
sqlite> SELECT * FROM EMPLOYEES;
ID NAME AGE DEPARTMENT SALARY-- ------ --- ---------- -------1 David 27 IT 85000.02 Allen 25 HR 15000.03 Martin 23 Finance 20000.04 Mark 25 IT 65000.05 Paul 32 Finance 21000.06 Kim 22 HR 45000.07 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.02 Allen 25 HR 15000.03 Martin 23 Finance 20000.04 Mark 25 IT 65000.05 Paul 32 Finance 21000.06 Kim 22 HR 45000.0删除所有记录
Section titled “删除所有记录”要从 EMPLOYEES 表中删除所有记录,你可以执行不带 WHERE 子句的 DELETE 查询:
-- 警告:这将从表中删除所有数据。sqlite> DELETE FROM EMPLOYEES;此操作后,SELECT * FROM EMPLOYEES; 将不返回任何行。请注意,此操作不会删除表本身,只删除其内容。表结构仍然存在。
删除所有行时,此命令会为每行触发 DELETE 触发器。如果你想快速清空表且不需要触发器运行,一种更快(但非标准)的方法是 TRUNCATE TABLE,在 SQLite 中,这通常通过 DELETE 和手动重置自增计数器(如果存在)来模拟实现。
专业最佳实践和安全措施
Section titled “专业最佳实践和安全措施”鉴于 DELETE 的永久性,专业人士会遵循严格的安全措施:
1. 先用 SELECT 验证
Section titled “1. 先用 SELECT 验证”这是最重要的最佳实践。在运行 DELETE 命令之前,先编写一个带有完全相同 WHERE 子句的 SELECT 语句。这允许你预览将被删除的确切行集,从而防止灾难性的错误。
-- 步骤 1:预览要删除的行sqlite> SELECT * FROM EMPLOYEES WHERE DEPARTMENT = 'HR';
ID NAME AGE DEPARTMENT SALARY-- ----- --- ---------- -------2 Allen 25 HR 15000.06 Kim 22 HR 45000.0
-- 步骤 2:如果预览正确,执行 DELETEsqlite> DELETE FROM EMPLOYEES WHERE DEPARTMENT = 'HR';2. 使用事务
Section titled “2. 使用事务”执行高风险操作时,请将其封装在事务(transaction)中。事务允许你在犯错时撤销更改。你可以在使用 COMMIT 提交更改使其永久生效之前,或使用 ROLLBACK 放弃更改之前,先查看这些更改。
sqlite> BEGIN TRANSACTION;
-- 执行删除操作sqlite> DELETE FROM EMPLOYEES WHERE AGE < 25;
-- 此时,你可以运行 SELECT 来检查表的状态sqlite> SELECT * FROM EMPLOYEES;
-- 如果你犯了错误,可以撤销它!sqlite> ROLLBACK;
-- 或者,如果一切正确,使其永久生效sqlite> COMMIT;