Prisma种子数据报错:唯一约束Figures_table_manufacturerID_key冲突
数据库种子数据导入报错:唯一约束
Figures_table_manufacturerID_key冲突 向数据库添加种子数据时触发错误:唯一约束Figures_table_manufacturerID_key冲突,尝试修复未果,相关代码如下:
Prisma Schema
generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model Figures_table { id String @id @unique name String @db.LongText category String @db.LongText price String @db.LongText specifications String @db.LongText releaseInfo String @db.LongText details String @db.LongText createdAt DateTime @default(now()) Series Series[] Images Images[] Manufacturers Manufacturers[] serieID Int @unique manufacturerID Int @unique } model Series { id Int @id @unique @default(autoincrement()) serie String serieReferenceID Figures_table @relation(fields: [id], references: [serieID]) } model Manufacturers { id Int @id @unique @default(autoincrement()) manufacturer String manufacturerReferenceID Figures_table @relation(fields: [id], references: [manufacturerID]) } model Images { id Int @id @unique @default(autoincrement()) link String figureID String figureReferenceID Figures_table @relation(fields: [figureID], references: [id]) }
种子数据代码
import { PrismaClient } from "@prisma/client"; import { series, manufacturers, images, figures } from "./data"; async function seed() { const prisma = new PrismaClient(); await prisma.figures_table.createMany({ data: figures as any }); await prisma.images.createMany({ data: images as any }); await prisma.manufacturers.createMany({ data: manufacturers as any }); await prisma.series.createMany({ data: series as any }); } seed();
问题分析与修复方案
核心问题
Schema关系逻辑完全颠倒:
Figures_table中的serieID和manufacturerID被标记为@unique,意味着全表中这两个字段的值不能重复,但业务逻辑上多个手办理应属于同一个系列或厂商,该约束完全违背需求,是冲突的根源。- 关联方向错误:
Series和Manufacturers用自身id关联Figures_table的对应字段,导致每个系列/厂商只能绑定一个手办,完全搞反了一对多的关联关系。
种子数据导入顺序错误:
当前先导入figures_table再导入关联表,不符合关联数据的依赖逻辑,即使关系正确也可能触发外键错误。
修复步骤
1. 修正Prisma Schema(关键)
调整为正确的一对多关联,让系列和厂商作为主表,手办表通过外键关联:
generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model Figures_table { id String @id @unique name String @db.LongText category String @db.LongText price String @db.LongText specifications String @db.LongText releaseInfo String @db.LongText details String @db.LongText createdAt DateTime @default(now()) serieId Int? // 移除@unique,允许重复值 manufacturerId Int? // 移除@unique,允许重复值 series Series? @relation(fields: [serieId], references: [id]) manufacturer Manufacturers? @relation(fields: [manufacturerId], references: [id]) images Images[] } model Series { id Int @id @default(autoincrement()) serie String figures Figures_table[] // 一个系列对应多个手办 } model Manufacturers { id Int @id @default(autoincrement()) manufacturer String figures Figures_table[] // 一个厂商对应多个手办 } model Images { id Int @id @default(autoincrement()) link String figureId String figure Figures_table @relation(fields: [figureId], references: [id]) }
2. 调整种子数据导入顺序
先导入主表(系列、厂商),再导入依赖它们的手办表,最后导入图片:
import { PrismaClient } from "@prisma/client"; import { series, manufacturers, images, figures } from "./data"; async function seed() { const prisma = new PrismaClient(); // 先创建系列和厂商数据 await prisma.series.createMany({ data: series }); await prisma.manufacturers.createMany({ data: manufacturers }); // 再创建手办数据(确保外键对应已存在的系列/厂商ID) await prisma.figures_table.createMany({ data: figures as any }); // 最后创建图片数据 await prisma.images.createMany({ data: images as any }); } seed();
3. 验证种子数据
确保figures数据中的serieId和manufacturerId值,与series、manufacturers数据中的id完全匹配,避免出现不存在的外键值。
内容的提问来源于stack exchange,提问作者Daniel Roberto
相关产品推荐
相关产品推荐

