跳转至

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;