软删除字段最常用tinyint(1)或boolean,值0表示未删除、1表示已软删除;navicat中在“设计表”→“字段”选项卡添加字段,类型选tinyint、长度1、设默认值0、勾选not null。
软删除字段该用什么数据类型
软删除字段本质是逻辑标记,不是物理删除,所以不能用 delete 语句触发。最常用的是 tinyint(1) 或 boolean(mysql 中二者等价),值为 0 表示未删除,1 表示已软删除。不建议用 varchar 存 "true"/"false" 或 "y/n",会增加索引开销、影响查询性能,也容易因大小写或空格出错。
如果业务需要记录谁删的、何时删的,可额外加两个字段:deleted_at(DATETIME 类型,允许为 NULL)和 deleted_by(BIGINT 或 INT,关联用户表主键)。注意:这两个字段在模型设计器里必须设为 Allow NULL,否则插入新记录时会报错。
在 Navicat 模型设计器里怎么加软删除字段
打开模型 → 右键目标表 → 选“设计表”,进入字段选项卡:
- 点击“添加字段”,填入字段名,比如
is_deleted - 类型选
TINYINT,长度填1,勾选Unsigned - 默认值设为
0(不是空字符串或NULL) - 取消勾选
NOT NULL—— 等等,这里要特别注意:虽然业务上它不该为空,但 Navicat 模型设计器有时对NOT NULL+ 默认值的组合生成 SQL 不一致,尤其跨数据库导出时;稳妥做法是保持NOT NULL勾选,同时确保默认值明确写死为0 - 如果加了
deleted_at,类型选DATETIME,默认值留空(即NULL),并确认“允许空值”已勾选
模型保存后,SQL 生成是否自动适配软删除逻辑
不会。Navicat 的模型设计器只管结构,不管业务逻辑。它生成的建表语句只会包含字段定义,比如:
CREATE TABLE `users` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(50), `is_deleted` TINYINT(1) NOT NULL DEFAULT 0 );
但不会自动给你加上 WHERE is_deleted = 0 这类查询条件,也不会改写 DELETE FROM users WHERE id = 1 为 UPDATE users SET is_deleted = 1 WHERE id = 1。这些必须靠你自己的应用层代码或视图/存储过程实现。
如果你用 Navicat 的“查询”功能手写 SQL,记得每次查数据都显式过滤:SELECT * FROM users WHERE is_deleted = 0;否则模型看着干净,线上却漏查已软删除的数据。
导出模型为 SQL 时容易忽略的兼容性问题
Navicat 导出模型为 SQL 脚本时,默认按当前连接的数据库类型生成语法,但软删除字段在不同库里的“布尔”表达有差异:
- MySQL 支持
TINYINT(1)和BOOLEAN,等价 - PostgreSQL 用
BOOLEAN,不能直接写1/0,得写TRUE/FALSE - SQL Server 推荐用
BIT,值为0或1,但 ORM 映射时可能识别为bool,需确认驱动行为
如果你的模型要复用于多个数据库,别依赖 Navicat 自动生成的 DDL —— 导出后务必人工核对字段类型,尤其是 is_deleted 在各目标库中的实际映射是否一致。一个 TINYINT 在 PostgreSQL 里建表会失败,这种错误不会在 Navicat 模型界面里提示。











