Prisma同字段配置多关联时外键约束名称重复报错如何解决?
问题原因
你为关联设置的别名仅用于让Prisma识别两组独立的关联关系,并不会修改外键约束的自动命名规则。你的两个@relation声明都绑定了同一个challenge_id作为外键字段,Prisma默认按照表名_字段名_fkey的规则生成外键约束名,两组关联生成的默认约束名均为user_challenges_challenge_id_fkey,因此触发重名冲突。
解决方案
方案1:优化表结构(推荐)
从业务逻辑来看,你不需要建立两组指向Challenge的关联,仅需在UserChallenges中新增获奖标记位即可实现需求,修改后的模型代码如下:
model Challenge { id String @id @default(uuid()) @db.Uuid user_challenges UserChallenges[] @@map("challenges") } model UserChallenges { challenge_id String @db.Uuid user_id String @db.Uuid is_winner Boolean @default(false) // 标记该参与记录是否为获奖记录 challenge Challenge @relation(fields: [challenge_id], references: [id]) @@id([challenge_id, user_id]) // 新增联合主键避免同一个用户重复参与同一个挑战 @@map("user_challenges") }
后续查询某个挑战的获奖者时,直接增加is_winner: true的过滤条件即可。
方案2:手动指定外键约束名
如果业务逻辑确实需要保留两组独立关联,你可以为其中一个@relation手动设置map参数自定义外键约束名,规避重名问题:
model Challenge { id String @id @default(uuid()) @db.Uuid user_challenges UserChallenges[] winners UserChallenges[] @relation("ChallengeWinners") @@map("challenges") } model UserChallenges { challenge_id String @db.Uuid user_id String @db.Uuid challenge Challenge @relation(fields: [challenge_id], references: [id]) // 手动指定外键约束名避免重复 winners Challenge? @relation("ChallengeWinners", fields: [challenge_id], references: [id], map: "user_challenges_winner_challenge_fkey") @@map("user_challenges") }
内容的提问来源于stack exchange,提问作者Arthur Roberto Fronza
相关产品推荐
相关产品推荐

