DELETE语句
定义
DELETE语句是SQL中的DML(数据操作语言)命令,用于从表中删除一行或多行数据。与DROP TABLE和TRUNCATE TABLE不同,DELETE语句只删除数据行,保留表结构。
作用
DELETE语句在数据库操作中具有以下重要优势: 1. 数据清理:可以删除过期或无效的数据 2. 数据维护:支持选择性删除特定数据 3. 数据一致性:可以确保相关数据的同步删除 4. 数据安全:支持事务回滚,避免误删除 5. 业务逻辑实现:支持各种业务场景的数据删除需求
代码演示
基本语法
-- 删除单行
DELETE FROM users WHERE id = 1;
-- 删除多行
DELETE FROM products WHERE status = 'discontinued';
-- 删除所有行
DELETE FROM temp_table;
条件删除
-- 使用多个条件
DELETE FROM orders
WHERE status = 'cancelled'
AND created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR);
-- 使用子查询
DELETE FROM customers
WHERE id NOT IN (
SELECT DISTINCT customer_id
FROM orders
WHERE customer_id IS NOT NULL
);
多表删除
-- 使用JOIN删除
DELETE u, p
FROM users u
LEFT JOIN user_profiles p ON u.id = p.user_id
WHERE u.status = 'deleted';
-- 级联删除
DELETE FROM order_items
WHERE order_id IN (
SELECT id FROM orders WHERE status = 'cancelled'
);
DELETE FROM orders WHERE status = 'cancelled';
详细说明
1. 基本语法结构
DELETE FROM table_name
WHERE condition;
2. 删除操作类型
- 单行删除:删除特定的一行数据
- 多行删除:同时删除多行数据
- 条件删除:根据条件选择性地删除数据
- 批量删除:一次删除大量数据
- 关联删除:基于其他表的数据进行删除
3. 删除限制
- 外键约束:不能删除被其他表引用的数据
- 唯一约束:删除操作不会影响唯一约束
- 非空约束:删除操作不会影响非空约束
- 事务限制:在事务中删除可以回滚
4. 性能考虑
- 索引使用:WHERE子句中的列最好有索引
- 批量删除:大量数据删除时使用分批处理
- 事务处理:相关删除操作使用事务保证一致性
最佳实践
1. 安全性
-- 启用安全删除模式
SET sql_safe_updates = 1;
-- 删除前备份数据
CREATE TABLE backup_table AS
SELECT * FROM target_table
WHERE condition;
2. 性能优化
-- 使用索引优化WHERE条件
CREATE INDEX idx_status ON users(status);
-- 分批删除大表
DELETE FROM large_table
WHERE condition
LIMIT 1000;
3. 软删除策略
-- 添加删除标记列
ALTER TABLE users ADD COLUMN deleted_at TIMESTAMP NULL;
-- 软删除:标记为已删除
UPDATE users
SET deleted_at = NOW()
WHERE id = 1;
-- 查询时排除已删除数据
SELECT * FROM users WHERE deleted_at IS NULL;