软删除 vs 硬删除:MySQL 实现软删除(is_deleted 字段),避免数据丢失
前言
开发中直接 DELETE 硬删除数据,一旦误删无法恢复,订单、用户、商品等核心业务数据绝对不能物理删除。行业通用方案:软删除(逻辑删除),通过 is_deleted 标记区分有效 / 已删除数据。
一、硬删除(DELETE,不推荐核心业务)
-- 物理删除,数据彻底消失,无备份无法找回 DELETE FROM user WHERE user_id = 10;缺点:误删无法恢复,无法统计历史订单、用户数据,丢失业务记录。
二、软删除设计方案
1. 表统一增加软删除字段
CREATE TABLE user ( user_id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) NOT NULL, password VARCHAR(64) NOT NULL, is_deleted TINYINT DEFAULT 0 COMMENT '0正常 1已逻辑删除', delete_time DATETIME NULL COMMENT '删除时间' );字段说明:
is_deleted:0 = 有效数据,1 = 已删除;delete_time:记录删除时间,用于统计、恢复。
2. 逻辑删除操作(替代 DELETE)
-- 软删除,仅修改标记,数据保留 UPDATE user SET is_deleted = 1, delete_time = NOW() WHERE user_id = 10;3. 查询时过滤已删除数据(所有业务查询必加条件)
-- 查询有效用户,自动屏蔽已删除数据 SELECT * FROM user WHERE is_deleted = 0; -- 恢复已删除数据 UPDATE user SET is_deleted = 0, delete_time = NULL WHERE user_id = 10; -- 查询所有含已删除数据(后台管理、数据复盘) SELECT * FROM user;三、复合索引优化(避免查询变慢)
几乎所有查询都会带is_deleted=0,建立联合索引:
-- 常用查询条件:username + is_deleted CREATE INDEX idx_name_del ON user(username,is_deleted);四、软删除优缺点
优点
- 误删可随时恢复,保留完整业务历史数据;
- 支持订单、财务数据溯源、对账;
- 无需频繁备份规避删除风险。
缺点
- 表数据持续膨胀,长期需定时归档历史删除数据;
- 所有业务查询必须携带
is_deleted=0,遗忘会查出已删除脏数据。
五、开发规范避坑
- 所有业务表统一添加
is_deleted、delete_time; - 前端列表、业务查询强制过滤
is_deleted=0; - 多表关联 JOIN 时,每张表都要加软删除条件;
- 定期归档长期软删除数据至历史归档表,减少主表压力。
六、多表关联软删除示例
-- 查询有效用户+有效订单,两张表都过滤软删除 SELECT u.username,o.order_no FROM user u LEFT JOIN `order` o ON u.user_id = o.user_id AND o.is_deleted = 0 WHERE u.is_deleted = 0;