逻辑删除为什么必须是 NOT NULL DEFAULT 0
极小而极具体的一条约定,以及它拦住过什么。
如果 `is_deleted` 允许为 NULL,那么“未删除”就有两种表示:0 和 NULL。任何一处条件写成 `is_deleted = 0`,都会静默漏掉 NULL 的那批行。
这种漏数据不会报错,只会让你在某个对账的下午发现数字差了一截,而且查不出来差在哪。
所以约定是:列非空、默认 0、由基类统一带上条件、手写 SQL 必须自己补。写法上只多两个单词,换来的是“查出来的就是全部”。
把手写 SQL 的断言跑在测试里,漏条件的那一刻就会失败并打印真实 SQL——不用等到线上。
最后更新 2026-10-09← 文章