如何实现软删除功能_mysql逻辑删除方案

9次阅读

软删除是通过标记字段(如is_deleted)标识记录状态而非物理删除,需添加索引、默认值,并统一修改增删改查逻辑,配合应用层拦截与审计字段实现全链路控制。

如何实现软删除功能_mysql逻辑删除方案

软删除不是真正从数据库中删掉数据,而是通过标记字段(如 is_deleted)来标识某条记录“已被删除”,查询时默认过滤掉这些记录。

添加逻辑删除字段

在需要支持软删除的表中,新增一个字段用于标识删除状态。推荐使用 TINYint(1)enum(‘0′,’1’) 类型,值为 0 表示未删除,1 表示已删除。

  • 字段名建议统一,如 is_deleteddeleted_at(用 NULL 表示未删除,时间戳表示删除时间)
  • 加索引提升查询效率:ALTER table user ADD INDEX idx_is_deleted (is_deleted);
  • 设置默认值为 0:is_deleted TINYINT(1) default 0 NOT NULL

修改增删改查逻辑

所有涉及该表的 sql 操作都要适配软删除语义:

  • 插入:无需改动,is_deleted 默认为 0
  • 删除:改用 UPDATE ... SET is_deleted = 1 WHERE id = ? AND is_deleted = 0
  • 查询:所有常规查询需加上 WHERE is_deleted = 0 条件(可封装到视图或通用查询方法中)
  • 更新:通常不需额外处理,但注意避免误更新已删除记录(可加 AND is_deleted = 0 条件)

考虑兼容性与扩展性

真实业务中常需保留删除人、删除时间等信息,可补充字段增强审计能力:

  • deleted_by:INT,记录操作人 ID
  • deleted_at:DATETIME,记录删除时间(配合 is_deleted 使用更灵活)
  • 若只用 deleted_at 判断,NULL 表示未删除,非 NULL 表示已删除,更直观且便于统计

应用层配合要点

数据库只是基础,应用代码必须同步约束:

  • ORM 框架(如 mybatis-Plus、laravel Eloquent)大多支持全局逻辑删除插件,开启后自动拦截 delete 和 select
  • 手写 SQL 时务必检查 WHERE 条件是否遗漏 is_deleted = 0
  • 管理后台“回收站”功能可查 is_deleted = 1 的数据,支持还原
  • 定时归档任务可定期将长期 is_deleted = 1 的数据物理备份后清除

软删除本质是数据可见性控制,核心在于统一字段定义、全链路过滤、权限与审计兼顾。不复杂但容易忽略细节。

text=ZqhQzanResources