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

在Phoenix中保存数据至数据库时遇`null value in column "id" of relation table_name`错误

解决Repo.insert时id字段为null的问题

出现这个问题通常是这几个原因,对应排查就行:

  • 数据库表的id字段没配置自动生成规则
    你说id不用手动设置,前提是数据库里这个字段得是自动递增/生成的。比如PostgreSQL里得把id设成SERIAL、IDENTITY类型,或者绑定了序列。要是表结构里id只是普通INT,没开自动生成,数据库肯定会要求你传值,不然就报null错误。

  • Ecto Schema的主键配置错了
    检查你的Schema定义,默认Ecto会把:id设为自增主键,但如果主键名不是id,或者你手动改了配置——比如写了field :id, :integer而不是用默认主键设置,或者改了@primary_key却没开autogenerate: true——那Ecto就不会自动生成id,插入时就会传null。

    正确的主键配置示例:

    # 默认自增整数主键
    schema "table_name" do
      # 其他字段定义...
    end
    
    # 或者手动指定UUID类型主键(需开启自动生成)
    @primary_key {:id, :binary_id, autogenerate: true}
    schema "table_name" do
      # 其他字段定义...
    end
    
  • 创建表的迁移文件有问题
    看一下该表的迁移代码,是不是没把id设为自增主键。正常创建表的迁移应该是:

    create table(:table_name) do
      # 其他字段
    end
    

    这样默认会生成自增的id主键。要是你手动写add :id, :integer,没加primary_key: true和autogenerate: true,那表结构就不符合预期,插入时自然报错。

  • 插入时不小心传了id: nil
    检查你构造的插入数据或者changeset,有没有手动把id: nil写进去?比如构造%{id: nil, name: "xxx"}这种数据,会覆盖Ecto自动生成的id值,导致插入时传null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:16:59