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

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();

问题分析与修复方案

核心问题

  1. Schema关系逻辑完全颠倒:

    • Figures_table中的serieID和manufacturerID被标记为@unique,意味着全表中这两个字段的值不能重复,但业务逻辑上多个手办理应属于同一个系列或厂商,该约束完全违背需求,是冲突的根源。
    • 关联方向错误:Series和Manufacturers用自身id关联Figures_table的对应字段,导致每个系列/厂商只能绑定一个手办,完全搞反了一对多的关联关系。
  2. 种子数据导入顺序错误:
    当前先导入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:35:37