软删除 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);

四、软删除优缺点

优点

  1. 误删可随时恢复,保留完整业务历史数据;
  2. 支持订单、财务数据溯源、对账;
  3. 无需频繁备份规避删除风险。

缺点

  1. 表数据持续膨胀,长期需定时归档历史删除数据;
  2. 所有业务查询必须携带is_deleted=0,遗忘会查出已删除脏数据。

五、开发规范避坑

  1. 所有业务表统一添加is_deleteddelete_time
  2. 前端列表、业务查询强制过滤is_deleted=0
  3. 多表关联 JOIN 时,每张表都要加软删除条件;
  4. 定期归档长期软删除数据至历史归档表,减少主表压力。

六、多表关联软删除示例

-- 查询有效用户+有效订单,两张表都过滤软删除 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;