不能直接用DELETE语句删数据,因为物理删除会丢失审计痕迹、违反合规要求并破坏外键关联;应采用软删除,即通过deleted_at字段标记删除状态,并配合索引和视图自动过滤已删记录。
为什么不能直接用 DELETE 语句删数据
因为真实业务中,订单、用户、日志等记录一旦被物理删除,就无法追溯操作痕迹、影响审计合规,还可能破坏外键关联或统计口径。软删除本质是用字段标记状态,不是真删——最常见做法是加 deleted(tinyint/boolean)或 deleted_at(datetime)字段。
建表时必须加软删除字段并设默认值
别等后期补,否则要改大量 SQL 和应用逻辑。推荐用 deleted_at 而非 deleted,原因有三:能区分“未删”“已删”“删的时间”,便于恢复和分析;避免 WHERE deleted = 0 和 IS NULL 混用;兼容 MySQL 5.7+、PostgreSQL、SQL Server 的索引优化。
示例建表语句:
CREATE TABLE users ( id BIGINT PRIMARY KEY, name VARCHAR(50), deleted_at DATETIME NULL DEFAULT NULL, INDEX idx_deleted_at (deleted_at) );
注意:INDEX idx_deleted_at (deleted_at) 很关键——后续视图和查询都依赖这个字段过滤,没索引会导致全表扫描。
用视图封装「自动过滤已删除」的查询逻辑
视图不是装饰,是统一入口。所有业务代码查 users 表,都应该改成查 v_users 视图,这样哪怕某天忘了写 WHERE deleted_at IS NULL,也不会漏掉过滤。
创建视图语句:
CREATE VIEW v_users AS SELECT id, name FROM users WHERE deleted_at IS NULL;
使用时直接: