Prisma添加Request与UserAgent关联时触发errno:150外键约束错误
问题解决:Prisma外键约束错误(errno:150)
核心原因
触发错误的本质是Request表的userAgentId字段类型与UserAgent表的id字段类型不匹配:
- UserAgent的id定义为
Int @db.UnsignedInt(无符号整数) - 你注释的userAgentId仅为普通
Int(有符号整数)
MySQL要求外键字段与被引用字段的类型、属性(如是否无符号)必须完全一致,否则会抛出"Foreign key constraint is incorrectly formed"错误。
修复步骤
- 给Request表的userAgentId添加
@db.UnsignedInt属性,与UserAgent的id类型对齐 - 取消所有关联代码的注释,确保双向关联配置正确
修正后的完整schema代码
model Request { id Int @id @default(autoincrement()) @db.UnsignedInt userId String? url String ip String? userAgentId Int? @db.UnsignedInt // 添加@db.UnsignedInt,设为可选(可根据业务需求调整为必填) user User? @relation(fields: [userId], references: [id]) userAgent UserAgent? @relation(fields: [userAgentId], references: [id]) // 设为可选,避免强制关联 } model UserAgent { id Int @id @default(autoincrement()) @db.UnsignedInt name String browser String engine String os String device String cpu String requests Request[] // 启用双向关联 } model User { id String @id @default(cuid()) email String? @unique role Role @default(USER) name String? image String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? accounts Account[] sessions Session[] requests Request[] //userAgentId Int? @db.UnsignedInt // 若不需要User与UserAgent的关联可保持注释 }
额外实用技巧
若需查看底层MySQL语句,可运行命令:prisma migrate dev --create-only,该命令会生成未执行的SQL迁移文件,你能直接查看其中的外键创建逻辑,便于后续排查类似问题。
内容的提问来源于stack exchange,提问作者Dillan Wilding
相关产品推荐
相关产品推荐

