SQLite Delete 语句

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
忘记 WHERESELECT 验证!

快速参考表

操作语法
删除单行WHERE id = 1
删除多行WHERE status = 'inactive'
删除所有DELETE FROM table
条件组合WHERE a=1 AND (b=2 OR c=3)
安全删除BEGIN; DELETE ...; COMMIT;

最佳实践

  1. 永远先用 SELECT 预览 WHERE 结果
  2. 生产环境优先软删除
  3. 大批量删除使用事务
  4. 删除后检查 ROWCOUNT
-- 查看删除了多少行
SELECT changes() AS deleted_rows;

需要我帮你写一个针对你表的 DELETE 语句吗?
请提供表名和要删除的条件,我可以生成安全、可预览的 SQL!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部