贝利信息

SQL 软删除字段该如何设计?

日期:2026-01-19 00:00 / 作者:冰川箭仙
推荐使用 deleted_at 时间戳字段实现软删除,NULL 表示未删除,非空表示已删除,支持审计、归档与索引优化,并需在 ORM 层统一过滤。

软删除字段通常用一个布尔型或时间戳字段来标记数据是否被“删除”,而不是真正从数据库中移除。设计时核心目标是:不影响原有查询逻辑、便于恢复、避免误删、兼顾性能和可读性。

推荐用 deleted_at 时间戳字段

比布尔字段(如 is_deleted)更灵活,能记录删除时间,支持按时间范围审计、自动归档或定时清理。值为 NULL 表示未删除,非空表示已软删除。

配合索引提升查询效率

大量数据下,WHERE deleted_at IS NULL 可能走全表扫描。建议为该字段建立单独索引,或与高频查询字段组合成联合索引。

业务层需统一拦截“未删除”条件

避免每个 SQL 都手动写 WHERE deleted_at IS NULL,应在 ORM 或 DAO 层做默认过滤。

慎用布尔字段 is_deleted

虽然简单,但存在语义歧义(比如初始值设 true 还是 false?逻辑反转易出错),且无法记录删除时间,后续扩展性差。

软删除不是银弹——长期堆积的“已删”数据会拖慢备份、迁移和统计;定期归档或物理清理仍有必要。设计时把 deleted_at 当作一等公民字段对待,从建表、索引、查询到业务逻辑层层对齐,才能真正落地可靠。