SQL DELETE 删除数据
DELETE 语句用于从表中删除数据。
基本语法
DELETE FROM 表名
WHERE 条件;
重要:务必使用 WHERE 条件,否则会删除所有数据!
演示表
假设有 users 表:
| id | name | age | country | salary | |
|---|---|---|---|---|---|
| 1 | 张三 | zhangsan@email.com | 25 | China | 5000 |
| 2 | 李四 | lisi@email.com | 30 | USA | 7000 |
| 3 | 王五 | wangwu@email.com | 28 | China | 6000 |
| 4 | 赵六 | zhaoliu@email.com | 35 | USA | 8000 |
| 5 | 孙七 | sunqi@email.com | 25 | UK | 5500 |
删除示例
1. 删除单条数据
-- 删除 id 为 1 的用户
DELETE FROM users
WHERE id = 1;
删除后:
| id | name | age | country | salary | |
|---|---|---|---|---|---|
| 2 | 李四 | lisi@email.com | 30 | USA | 7000 |
| 3 | 王五 | wangwu@email.com | 28 | China | 6000 |
| 4 | 赵六 | zhaoliu@email.com | 35 | USA | 8000 |
| 5 | 孙七 | sunqi@email.com | 25 | UK | 5500 |
2. 删除符合条件的数据
-- 删除所有中国用户
DELETE FROM users
WHERE country = 'China';
3. 删除多条记录
-- 删除年龄大于30的用户
DELETE FROM users
WHERE age > 30;
4. 使用复杂条件
-- AND 条件
DELETE FROM users
WHERE country = 'USA' AND salary < 7500;
-- OR 条件
DELETE FROM users
WHERE country = 'UK' OR country = 'Japan';
-- IN 列表
DELETE FROM users
WHERE id IN (1, 2, 3);
危险操作
1. 忘记 WHERE
-- 危险!会删除表中所有数据
DELETE FROM users;
2. 正确的删除方式
-- 备份数据后再删除
-- 建议先查询确认
SELECT * FROM users WHERE country = 'China';
-- 确认后再删除
DELETE FROM users WHERE country = 'China';
3. 使用 LIMIT 限制删除数量
-- 只删除1条记录
DELETE FROM users
WHERE country = 'China'
LIMIT 1;
TRUNCATE 清空表
TRUNCATE TABLE 比 DELETE 快,但无法指定条件:
-- 清空表中所有数据
TRUNCATE TABLE users;
DELETE vs TRUNCATE
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| 速度 | 较慢 | 快 |
| 条件删除 | 支持 | 不支持 |
| 事务回滚 | 支持 | 不完全支持 |
| 重置自增 | 否 | 是 |
-- DELETE 可以回滚
BEGIN;
DELETE FROM users WHERE id = 1;
ROLLBACK; -- 撤销删除
-- TRUNCATE 无法回滚
TRUNCATE TABLE users; -- 无法撤销
常见错误
1. 删除不存在的记录
-- 不会报错,只是没有删除任何数据
DELETE FROM users WHERE id = 100;
-- Affected rows: 0
2. 外键约束
-- 如果有外键约束,可能删除失败
DELETE FROM users WHERE id = 1;
-- Error: Cannot delete or update a parent row
-- 需要先删除关联的数据
PostgreSQL / SQLite 语法
RETURNING
-- PostgreSQL
DELETE FROM users
WHERE country = 'China'
RETURNING *;
-- SQLite
DELETE FROM users
WHERE country = 'China'
RETURNING id, name;
最佳实践
1. 先备份
-- 创建备份表
CREATE TABLE users_backup AS SELECT * FROM users;
-- 然后删除
DELETE FROM users WHERE country = 'China';
2. 使用软删除
-- 添加 deleted 字段
ALTER TABLE users ADD COLUMN is_deleted BOOLEAN DEFAULT FALSE;
-- 软删除
UPDATE users SET is_deleted = TRUE WHERE id = 1;
-- 查询时过滤
SELECT * FROM users WHERE is_deleted = FALSE;
3. 使用事务
BEGIN;
DELETE FROM users WHERE age > 40;
-- 检查结果
SELECT * FROM users;
-- 确认后提交
COMMIT;
-- 或回滚
-- ROLLBACK;
小结
本章我们学习了:
- DELETE 基本语法
- 条件删除
- TRUNCATE 清空表
- DELETE vs TRUNCATE 的区别
- 软删除和事务
练习
- 删除年龄小于20岁的用户
- 删除薪资最高的那条记录
- 删除所有 USA 用户
- 实现一个软删除功能