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

EF Core搭配PostgreSQL混合手动ID与自增ID导致主键冲突的解决办法

解决混合手动ID与自动生成ID的冲突问题

问题根源在于PostgreSQL的自增列依赖序列对象维护当前值,你手动插入ID为1、2的数据后,序列的当前值仍停留在初始状态(通常是1),导致自动生成ID时会重复使用已存在的主键值。

直接解决方案:初始化数据后重置序列

在插入演示数据并执行SaveChanges()后,手动更新对应表的序列值,让它从表中最大ID的下一个值开始:

  1. 执行以下SQL语句(注意表名和列名的大小写要与EF Core生成的一致):
SELECT setval(pg_get_serial_sequence('"DropDowns"', 'Id'), (SELECT MAX("Id") FROM "DropDowns"));
  1. 在EF Core代码中,可以通过Database.ExecuteSqlRaw执行该语句:
// 先插入演示数据
context.DropDowns.AddRange(new List<DropDown>()
{
    new() { Id = 1, Value = "Value1" },
    new() { Id = 2, Value = "Value2" },
});
context.SaveChanges();

// 重置序列到最大ID的下一个值
context.Database.ExecuteSqlRaw(@"
    SELECT setval(pg_get_serial_sequence('""DropDowns""', 'Id'), (SELECT MAX(""Id"") FROM ""DropDowns""));
");

原理说明

  • pg_get_serial_sequence('"DropDowns"', 'Id'):获取DropDowns表中Id列对应的序列名称。
  • setval(序列名, 目标值):将序列的当前值设置为目标值,后续自动生成ID时会从目标值+1开始。

额外建议

如果需要频繁初始化演示环境,可以将重置序列的逻辑封装到初始化方法中,确保每次插入演示数据后都能同步更新序列状态,避免重复出现主键冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:38:11