You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM+PostgreSQL插入实体报错:id列空值违反非空约束

可能的原因及对应解决方案

1. 数据库表缺少uuid生成默认值

你手动编写的建表语句没有为id字段配置自动生成uuid的默认值,PostgreSQL不会自动为非自增、无默认值的非空字段生成值。
正确的建表语句需要先开启uuid扩展,再配置字段默认值:

-- 先开启uuid扩展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE "my_table"(
    "id" uuid NOT NULL DEFAULT uuid_generate_v4(), 
    CONSTRAINT PK_my_table PRIMARY KEY (id)
);

其他实体运行正常大概率是因为它们是通过TypeORM的synchronize: true自动创建的表,TypeORM会自动为带@Generated('uuid')的字段添加默认值。

2. 注解组合存在版本兼容问题

部分旧版本TypeORM对@PrimaryColumn + @Generated('uuid')的组合支持存在缺陷,你可以直接使用更简洁的@PrimaryGeneratedColumn注解替换:

import { Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity('my_table')
export class MyTable {
    @PrimaryGeneratedColumn('uuid')
    id!: string;
}

该注解本身就包含了主键、uuid类型、自动生成的逻辑,兼容性更好。

3. 实体元数据未被当前EntityManager加载

如果你使用的是自定义初始化的EntityManager,没有提前将MyTable实体注册到对应数据源的元数据列表中,TypeORM会识别不到@Generated注解,不会在插入时自动处理id字段,导致插入空值报错。可检查你当前使用的EntityManager对应的数据源配置中,是否包含了MyTable实体的扫描路径。

4. 存在全局拦截逻辑覆盖id值

检查是否有全局的实体监听器、字段转换器、或者业务中间件在save操作执行前,自动为实体添加了值为undefined的id字段,该操作会覆盖TypeORM的自动生成逻辑。


内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:45:04