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

Prisma迁移回退报错:如何在不丢失数据的情况下恢复自增ID?

解决Prisma回退ID类型迁移时的报错问题

操作步骤:

  1. 生成待修改的迁移文件
    运行命令生成仅包含迁移模板的文件,不会直接执行:
npx prisma migrate dev --create-only

执行后会在 prisma/migrations 目录下生成一个新的迁移文件,里面默认的SQL逻辑是删除并重建userId列(这就是报错的根源)。

  1. 手动修改迁移文件的SQL代码
    打开生成的迁移文件,把自动生成的DROP/CREATE列逻辑,替换成类型转换+数据保留的SQL:
  • 先修改User表的id列(因为Note的userId是外键,依赖User的id,必须先改主表):
ALTER TABLE "User" ALTER COLUMN "id" TYPE integer USING "id"::integer;
  • 再修改Note表的userId列:
ALTER TABLE "Note" ALTER COLUMN "userId" TYPE integer USING "userId"::integer;

原理:PostgreSQL的USING子句可以指定字符串转整数的规则,你的数据本来就是字符串形式的整数,用::integer就能直接转换,不会丢失数据。

  1. 执行修改后的迁移
    运行命令执行迁移:
npx prisma migrate dev

此时Prisma会执行你修改后的SQL,将字符串类型的ID字段转换回整数,同时保留所有数据。

  1. 验证数据完整性
    迁移完成后,可通过npx prisma studio打开Prisma可视化工具,检查User和Note表的ID字段类型是否恢复为整数,数据是否完整。

前置检查(必做)

在修改迁移文件前,先确认数据库中所有字符串格式的ID都是有效的整数(无字母、符号等非数字内容),可通过以下SQL查询验证:

-- 检查User表的id是否全为数字字符串
SELECT id FROM "User" WHERE id !~ '^[0-9]+$';

-- 检查Note表的userId是否全为数字字符串
SELECT userId FROM "Note" WHERE userId !~ '^[0-9]+$';

如果查询到非数字的记录,需要先手动修正这些数据,否则迁移时会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:10:11