DELETE 语句是 MySQL 中用于删除表中数据的关键命令,下面我将全面介绍其使用方法及最佳实践。

基本语法

DELETE FROM <表名>

[WHERE 条件]

[ORDER BY 字段]

[LIMIT 行数];

 

关键组成部分

1. WHERE 子句:确定哪些行将被删除(强烈建议使用)

2. ORDER BY 子句:控制删除顺序(可选)

3. LIMIT 子句:限制删除的行数(可选)

 

实际应用示例

1. 删除所有数据(清空表)

删除表中所有记录(危险操作!)

DELETE FROM tb_courses_new;

 

2. 条件删除

删除特定ID的课程

DELETE FROM tb_courses 
WHERE course_id = 4;


3. 多条件删除

删除3年前且状态为过期的订单

DELETE FROM orders
WHERE order_date < DATE_SUB(NOW(), INTERVAL 3 YEAR)
AND status = 'expired';


4. 带LIMIT的分批删除

每次删除1000条过期待处理订单

DELETE FROM pending_orders
WHERE expire_date < NOW()
LIMIT 1000;


5. 排序后删除

删除最旧的10条日志记录

DELETE FROM system_logs
ORDER BY log_time ASC
LIMIT 10;


高级用法

1. 使用子查询删除

删除没有订单的客户

DELETE FROM customers
WHERE customer_id NOT IN (
    SELECT DISTINCT customer_id FROM orders
);

 

2. 多表关联删除

删除已发货的订单及相关项

DELETE o, oi
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
WHERE o.status = 'shipped';

3. 使用JOIN删除

删除已取消订单的商品项

DELETE oi
FROM order_items oi
INNER JOIN orders o ON oi.order_id = o.order_id
WHERE o.status = 'cancelled';

注意事项与最佳实践

1. WHERE子句重要性:除非确实需要删除所有数据,否则必须使用WHERE子句

2. 事务使用:重要删除操作应在事务中进行

   START TRANSACTION;

   DELETE FROM ... WHERE ...;

   -- 确认无误后

   COMMIT;

   -- 或发现问题时

   ROLLBACK;

3.备份优先:执行删除前备份相关数据

4. 性能考虑:

   大表删除时使用LIMIT分批处理

    为WHERE条件字段建立索引提高效率

5. 替代方案:

    考虑使用标志位标记删除而非物理删除

    对需要清空的大表使用TRUNCATE TABLE(更快但不可回滚)

 

与TRUNCATE的区别

 

特性DELETETRUNCATE TABLE
语法DELETE FROM 表名 [WHERE 条件]TRUNCATE TABLE 表名
性能较慢(逐行删除并记录日志)极快(直接删除数据文件)
可回滚支持(在事务中)不支持(大多数情况下)
触发器会触发 DELETE 触发器不会触发任何触发器
自增ID不重置(继续递增)重置为初始值(通常为1)
WHERE条件支持(可条件删除)不支持(总是清空全表)

        

安全建议

1. 生产环境执行DELETE前:

   先使用SELECT确认影响范围

   SELECT * FROM table WHERE condition;

   然后替换为DELETE

   DELETE FROM table WHERE condition;

2. 考虑使用软删除模式(添加is_deleted字段)

3. 实施数据库权限控制,限制DELETE权限

4. 重要表设置删除审核流程

点赞(2)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)