跳到主要内容

SQL DELETE 删除数据

DELETE 语句用于从表中删除数据。

基本语法

DELETE FROM 表名
WHERE 条件;

重要:务必使用 WHERE 条件,否则会删除所有数据!

演示表

假设有 users 表:

idnameemailagecountrysalary
1张三zhangsan@email.com25China5000
2李四lisi@email.com30USA7000
3王五wangwu@email.com28China6000
4赵六zhaoliu@email.com35USA8000
5孙七sunqi@email.com25UK5500

删除示例

1. 删除单条数据

-- 删除 id 为 1 的用户
DELETE FROM users
WHERE id = 1;

删除后:

idnameemailagecountrysalary
2李四lisi@email.com30USA7000
3王五wangwu@email.com28China6000
4赵六zhaoliu@email.com35USA8000
5孙七sunqi@email.com25UK5500

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

特性DELETETRUNCATE
速度较慢
条件删除支持不支持
事务回滚支持不完全支持
重置自增
-- 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;

小结

本章我们学习了:

  1. DELETE 基本语法
  2. 条件删除
  3. TRUNCATE 清空表
  4. DELETE vs TRUNCATE 的区别
  5. 软删除和事务

练习

  1. 删除年龄小于20岁的用户
  2. 删除薪资最高的那条记录
  3. 删除所有 USA 用户
  4. 实现一个软删除功能