Node.js NestJS TypeORM SQLite新增非空字段触发临时表约束失败问题
问题分析与解决方案
核心问题:新增非空boolean字段未指定默认值
你遇到的错误本质是SQLite在给已有表添加非空字段时,必须为现有数据提供该字段的默认值,而你的实体定义仅声明了deleted为非空boolean类型,未设置默认值,导致TypeORM自动同步schema时触发约束错误。
具体原因拆解
temporary_MyTable的由来:SQLite不支持直接给已有表添加无默认值的非空字段,它的处理逻辑是创建带temporary_前缀的临时表,将原表数据导入临时表后替换原表。导入过程中新字段deleted没有值,触发NOT NULL约束,因此报错指向临时表。- 重启后报错/字段变null的逻辑:
- 删除表数据后首次启动:无数据需要导入,字段能成功创建,但因未设置默认值,SQLite会将该字段的默认属性设为
NULL(与你实体定义的非空规则冲突),重启时TypeORM同步schema会再次校验约束,触发错误甚至将已有数据的deleted字段置为null。 - 重建数据库后首次启动:新表无历史数据,插入数据时你可能在代码中显式设置了
deleted值,数据显示正常;但重启时TypeORM同步schema会发现实体定义的非空约束与数据库实际字段的默认规则不匹配,再次触发约束校验错误。
- 删除表数据后首次启动:无数据需要导入,字段能成功创建,但因未设置默认值,SQLite会将该字段的默认属性设为
修复方案
修改实体中deleted字段的定义,添加default属性指定默认值(软删除场景通常默认设为false):
@Column({ select: false, default: false }) deleted: boolean;
额外注意事项
- 若需保留现有数据,修改实体后建议手动给数据库中已有的
deleted字段批量设置默认值false,避免后续同步出现问题。 - 开发环境使用
synchronize: true虽便捷,但生产环境强烈建议使用TypeORM的Migration功能编写手动迁移脚本,避免schema同步带来的意外问题。
内容的提问来源于stack exchange,提问作者sirzento
相关产品推荐
相关产品推荐

