Prisma迁移回退报错:如何在不丢失数据的情况下恢复自增ID?
解决Prisma回退ID类型迁移时的报错问题
操作步骤:
- 生成待修改的迁移文件
运行命令生成仅包含迁移模板的文件,不会直接执行:
npx prisma migrate dev --create-only
执行后会在 prisma/migrations 目录下生成一个新的迁移文件,里面默认的SQL逻辑是删除并重建userId列(这就是报错的根源)。
- 手动修改迁移文件的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就能直接转换,不会丢失数据。
- 执行修改后的迁移
运行命令执行迁移:
npx prisma migrate dev
此时Prisma会执行你修改后的SQL,将字符串类型的ID字段转换回整数,同时保留所有数据。
- 验证数据完整性
迁移完成后,可通过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
相关产品推荐
相关产品推荐

