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

使用TypeORM迁移的createTable时,如何指定ID由数据库生成?

问题:TypeORM插入数据时ID字段违反非空约束

我在迁移中定义了创建categoria表的代码:

public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.createTable(new Table({
        name: 'categoria',
        columns: [{
            name: 'id',
            type: 'int',
            isPrimary: true,
            generatedIdentity: 'ALWAYS'

        },
        {
            name: 'nome',
            type: 'varchar(100)'
        },
        {
            name: 'categoria_mercadolivre',
            type: 'varchar(100)'
        }
    ]
    }), true)
}

在另一个迁移中尝试插入数据:

await queryRunner.manager.query(`insert into categoria (nome) values ('eletrônicos');`);

但出现错误:

error: null value in column "id" of relation "categoria" violates not-null constraint

请问该如何让TypeORM知晓ID是由数据库生成的?


解决方案

问题核心是你用原生SQL插入数据时,没有利用TypeORM的自动字段处理机制,或者表结构的生成策略没有正确配置。以下是两种可行的解决方式:

1. 使用TypeORM实体管理器的save方法插入

如果有对应的Categoria实体类,直接调用save方法,TypeORM会自动识别数据库生成的ID字段,无需手动传入:

await queryRunner.manager.save(Categoria, { nome: 'eletrônicos' });

2. 调整表结构配置并修正原生SQL

首先检查迁移中的ID字段配置,确保数据库真的生成ID值。可以将generatedIdentity替换为更通用的生成策略配置:

{
    name: 'id',
    type: 'int',
    isPrimary: true,
    isGenerated: true,
    generationStrategy: 'increment' // 针对MySQL/PostgreSQL等主流数据库适用,也可根据数据库选择'identity'
}

然后修改原生插入语句,明确让数据库使用默认生成的ID(部分数据库省略ID字段即可生效):

-- 推荐:省略ID字段,数据库自动生成
insert into categoria (nome) values ('eletrônicos');

-- 或者显式指定DEFAULT
insert into categoria (id, nome) values (DEFAULT, 'eletrônicos');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:58:22