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

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"错误。

修复步骤

  1. 给Request表的userAgentId添加@db.UnsignedInt属性,与UserAgent的id类型对齐
  2. 取消所有关联代码的注释,确保双向关联配置正确

修正后的完整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:15:13