如何重置Postgres序列以匹配Prisma迁移历史记录
解决PostgreSQL手动改表后Prisma
migrate dev 序列不匹配问题 报错原因
该报错是因为手动修改表结构时,改动了Product表id列关联的自增序列的归属、当前值或其他参数,和Prisma Schema中定义的自增主键规则不一致导致的。
操作步骤
- 第一步:确认序列归属
Prisma默认给自增id生成的序列名格式为"表名_列名_seq",本例对应序列名为Product_id_seq。先执行SQL查询确认序列归属正确:
如果查询结果的SELECT sequence_name, table_name, column_name FROM information_schema.sequences WHERE sequence_name = 'Product_id_seq';table_name和column_name不匹配Product和id,执行下面语句修复归属:ALTER SEQUENCE "Product_id_seq" OWNED BY "Product"."id"; - 第二步:确认Prisma期望的序列值
Prisma要求序列的下一个取值必须大于当前Product表中已存在的最大id,避免主键冲突。执行下面SQL查询当前表的最大id:SELECT COALESCE(MAX(id), 0) AS max_id FROM "Product"; - 第三步:重置序列
执行SQL直接将序列重置到符合要求的取值:
你也可以用下面的语法实现同样效果:SELECT setval('"Product_id_seq"', (SELECT COALESCE(MAX(id), 0) FROM "Product"));ALTER SEQUENCE "Product_id_seq" RESTART WITH (SELECT COALESCE(MAX(id), 0) + 1 FROM "Product"); - 第四步:验证修复
重置完成后重新执行prisma migrate dev,报错就会消失。如果还存在迁移历史不一致的提示,可以执行prisma migrate resolve --applied <最新迁移文件名>将对应迁移标记为已应用后再重试。
内容的提问来源于stack exchange,提问作者Tobbe
相关产品推荐
相关产品推荐

