Prisma中@unique标记可选字段user_id触发null重复键错误如何解决?
解决Prisma中可选关联字段@unique导致的null重复键错误
你的Player模型里,user_id作为可选字段却添加了@unique约束,这在MongoDB中会触发duplicate key { user_id: null }错误——因为MongoDB会把null当作一个具体的有效值,多个文档的user_id为null就违反了唯一键约束。
以下是两种可行的解决方法:
方案一:移除字段级@unique,改用模型级唯一索引
直接去掉user_id上的@unique,转而在模型层面定义唯一约束,MongoDB的模型级唯一索引会自动忽略null值,只对非空的user_id做唯一性校验,刚好满足「一个用户只能关联一个玩家,同时允许多个玩家不关联用户」的需求。
修改后的schema如下:
model Player { id String @id @default(auto()) @map("_id") @db.ObjectId steam_id String @unique name String level Int @default(1) elo Float @default(1500) games Game[] @relation(fields: [game_ids], references: [id]) game_ids String[] @db.ObjectId clients Client[] user User? @relation(fields: [user_id], references: [id]) user_id String? @db.ObjectId created_at DateTime @default(now()) updated_at DateTime @updatedAt @@map("players") // 模型级唯一约束,仅对非null的user_id生效 @@unique([user_id], map: "unique_player_user_id") }
方案二:配置双向一对一关联
如果你的User模型也需要限制最多关联一个Player,可以直接定义双向的一对一关联,Prisma会自动生成正确的约束,同样避免null值冲突。
Player模型修改:
user User? @relation(fields: [user_id], references: [id], unique: true) user_id String? @db.ObjectId
对应User模型添加关联:
player Player? @relation(fields: [player_id], references: [id], unique: true) player_id String? @db.ObjectId
这种方式下,Prisma会为user_id创建唯一索引,但MongoDB会忽略null值的文档,不会触发重复键错误。
内容的提问来源于stack exchange,提问作者user2896438
相关产品推荐
相关产品推荐

