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

如何让Supabase标识列在Upsert时自动递增?

解决Supabase Upsert时标识列id不自动递增的问题

1. 显式指定Upsert的冲突判断列

由于你的表主键不是默认的id,执行Upsert时必须明确告诉Supabase用哪一列判断记录是否存在。在C#客户端调用Upsert方法时,通过conflictTarget参数传入你的自定义主键列名:

await supabase.From<YourModel>()
              .Upsert(yourData, conflictTarget: new[] { "custom_primary_key_column" });

如果不指定冲突目标,Supabase无法正确识别重复记录,会导致标识列的自增逻辑异常。

2. 修正模型类的标识列映射

检查你的C#模型,确保id字段被标记为数据库自动生成的标识列。使用Postgrest.NET的特性标记:

public class YourModel
{
    [Column(IsIdentity = true)]
    public int? Id { get; set; } // 用可空类型避免默认值0被传入
    
    [PrimaryKey]
    public string CustomPrimaryKey { get; set; }
    
    // 其他业务字段
}

将Id设为可空类型(int?),能防止模型初始化时的默认值0被发送到数据库,让数据库触发自增逻辑。

3. 验证数据库表的标识列配置

登录Supabase控制台,执行SQL确认id列的标识配置是否正确:

SELECT column_name, is_identity 
FROM information_schema.columns 
WHERE table_name = 'your_table_name' AND column_name = 'id';

如果is_identity返回NO,需要重新设置该列为标识列:

ALTER TABLE your_table_name 
ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY;

4. 确保Upsert数据不包含id字段的默认值

在构造Upsert的实体对象时,不要主动设置Id属性的值(包括0)。如果模型中Id是值类型(非可空),初始化时会默认设为0,这会被客户端发送到数据库,覆盖自增逻辑——所以推荐用可空类型来规避这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:48:15