SQLite 的 DELETE 语句 用于删除表中的一行或多行记录。可以删除特定行或全部行。
基本语法
DELETE FROM table_name
[WHERE condition];
WHERE子句:决定删除哪些行- 有
WHERE→ 只删除满足条件的行 - 无
WHERE→ 删除表中所有数据(表结构保留)
示例表结构
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT,
email TEXT,
status TEXT DEFAULT 'active', -- 'active', 'inactive', 'deleted'
created_at DATE
);
-- 插入测试数据
INSERT INTO customers (name, email, status, created_at) VALUES
('Alice Tan', 'alice@example.com', 'active', '2025-01-10'),
('Bob Lim', 'bob@example.com', 'inactive', '2025-02-15'),
('Charlie Ng', 'charlie@example.com', 'active', '2025-03-20'),
('David Koh', 'david@example.com', 'deleted', '2025-04-05'),
('Eve Wong', 'eve@example.com', 'active', '2025-05-01');
1. 删除单行
-- 删除 ID 为 2 的客户
DELETE FROM customers WHERE id = 2;
2. 删除多行(使用条件)
-- 删除所有状态为 'deleted' 的记录
DELETE FROM customers WHERE status = 'deleted';
-- 删除邮箱以 @example.com 结尾且状态为 inactive 的用户
DELETE FROM customers
WHERE email LIKE '%@example.com' AND status = 'inactive';
3. 危险操作:删除所有数据
-- 删除 customers 表中所有记录(表结构保留!)
DELETE FROM customers;
警告:这 ≠
DROP TABLE,数据可通过事务回滚恢复(若在事务中)
4. 使用复杂条件删除
-- 删除 2025年1月注册的用户
DELETE FROM customers
WHERE created_at < '2025-02-01';
-- 删除名称包含 "David" 或 "Eve" 的用户
DELETE FROM customers
WHERE name IN ('David Koh', 'Eve Wong');
5. 结合子查询删除
-- 删除没有订单的客户(假设有 orders 表)
DELETE FROM customers
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = customers.id
);
6. 安全删除:先预览 + 事务
-- 第一步:先用 SELECT 确认要删除的行
SELECT * FROM customers WHERE status = 'inactive';
-- 第二步:确认无误后,开启事务删除
BEGIN TRANSACTION;
DELETE FROM customers WHERE status = 'inactive';
-- 查看结果
SELECT * FROM customers;
-- 满意 → 提交;不满意 → 回滚
COMMIT;
-- 或 ROLLBACK;
7. 软删除 vs 硬删除
硬删除(推荐用于测试/清理)
DELETE FROM customers WHERE id = 999;
软删除(生产环境推荐)
-- 添加 status 字段,标记为 'deleted'
UPDATE customers SET status = 'deleted' WHERE id = 999;
-- 查询时排除
SELECT * FROM customers WHERE status != 'deleted';
8. 性能优化
-- 为 WHERE 中常用列建立索引
CREATE INDEX idx_status ON customers(status);
CREATE INDEX idx_created_at ON customers(created_at);
提示:
DELETE后可执行VACUUM回收空间(大表慎用)
VACUUM;
9. 常见错误
| 错误 | 正确做法 |
|---|---|
DELETE customers | 应为 DELETE FROM customers |
WHERE email = NULL | 应为 WHERE email IS NULL |
忘记 WHERE | 先 SELECT 验证! |
快速参考表
| 操作 | 语法 |
|---|---|
| 删除单行 | WHERE id = 1 |
| 删除多行 | WHERE status = 'inactive' |
| 删除所有 | DELETE FROM table |
| 条件组合 | WHERE a=1 AND (b=2 OR c=3) |
| 安全删除 | BEGIN; DELETE ...; COMMIT; |
最佳实践
- 永远先用
SELECT预览WHERE结果 - 生产环境优先软删除
- 大批量删除使用事务
- 删除后检查
ROWCOUNT
-- 查看删除了多少行
SELECT changes() AS deleted_rows;
需要我帮你写一个针对你表的 DELETE 语句吗?
请提供表名和要删除的条件,我可以生成安全、可预览的 SQL!