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

Prisma自增id字段添加记录时触发唯一约束失败求助

Prisma自增ID字段唯一约束失败问题排查

问题描述

InventoryItem模型的id字段已配置@id @default(autoincrement()),但调用prisma.inventoryItem.create添加记录时,触发id字段唯一约束失败错误。使用版本:Prisma 5.2.0、@prisma/client 5.2.0。

模型定义:

model InventoryItem {
  id       Int @id @default(autoincrement())
  level    Int @default(0)
  position Int
  window   Int

  character   Character @relation(fields: [characterId], references: [id])
  characterId Int
  item        Item      @relation(fields: [itemId], references: [id])
  itemId      Int
}

调用代码:

await prisma.inventoryItem.create({
    data: {
        characterId: myCharacter.id,
        position: 0,
        level: item.level,
        itemId: item.id,
        window: 1
    }
})

排查与解决方法

  • 数据库自增序列不同步
    如果曾手动向数据库表中插入过指定id值的记录,会导致数据库的自增计数器未更新,后续Prisma生成的自增id会与已有记录冲突。
    解决:根据数据库类型重置自增序列:

    • MySQL:ALTER TABLE InventoryItem AUTO_INCREMENT = (SELECT MAX(id) + 1 FROM InventoryItem);
    • PostgreSQL:SELECT setval(pg_get_serial_sequence('"InventoryItem"', 'id'), (SELECT MAX(id) FROM "InventoryItem"));
  • Prisma客户端与数据库结构不同步
    修改模型后未重新生成客户端,或未同步数据库结构,导致Prisma的逻辑与实际数据库约束不匹配。
    解决:执行prisma generate重新生成客户端,再通过prisma migrate dev或prisma db push同步数据库结构。

  • 代码中隐式传递id字段
    检查代码是否在create的data参数中意外混入了id字段(比如解构对象时误包含),即使显式没写,隐式传递会覆盖自增逻辑。
    解决:确认data中仅包含需要的字段,排除id。

  • 数据库表结构未正确配置自增
    迁移过程可能出错,导致数据库表的id字段未实际设置为自增主键。
    解决:直接查看数据库表结构,确认id字段是自增主键类型,若不是则手动修正或重新执行迁移。

内容的提问来源于stack exchange,提问作者Onur Can Yavaş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:20:06