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

如何在SQL中定义0..1:0..1关系以适配Prisma db pull

解决MiniStore与Store的可选关联问题

第一步:修正SQL建表语句

原SQL中MiniStore的外键约束强制每个MiniStore必须关联Store,和你“存在未关联Store的MiniStore”的需求冲突。需要删除MiniStore中的反向外键,改为在Store表中添加正确的外键约束:

CREATE TABLE `MiniStore` (
  `idMiniprod` int unsigned NOT NULL AUTO_INCREMENT,
  `lat` float NOT NULL DEFAULT '0',
  `lng` float NOT NULL DEFAULT '0',
  `idLogo` int unsigned NOT NULL, -- 补充原SQL遗漏字段,与Prisma模型对齐
  PRIMARY KEY (`idMiniprod`),
  KEY `Logo_idx` (`idLogo`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs;

CREATE TABLE `Store` (
  `idProd` smallint unsigned NOT NULL,
  `Prodejna` varchar(60) NOT NULL,
  `idMiniprod` int unsigned DEFAULT NULL,
  `PKod` int unsigned NOT NULL, -- 补充原SQL遗漏字段,与Prisma模型对齐
  PRIMARY KEY (`idProd`),
  UNIQUE KEY `idMiniprod_UNIQUE` (`idMiniprod`),
  KEY `prod_idMiniprod_idx` (`idMiniprod`),
  -- 添加正确的外键:Store关联MiniStore(可选)
  CONSTRAINT `prod_miniprod`
    FOREIGN KEY (`idMiniprod`)
    REFERENCES `MiniStore` (`idMiniprod`)
    ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=cp1250;

关键修改点:

  • 删除MiniStore中miniprod_prod外键,解除MiniStore必须关联Store的强制限制
  • 在Store表中新增外键约束,保证Store关联的MiniStore合法性(若设置位置信息)

第二步:调整Prisma模型

将MiniStore中的store字段改为可选(添加?),修正关系定义:

model MiniStore {
  storePositionID Int   @id @default(autoincrement()) @map("idMiniprod") @db.UnsignedInt
  logoID          Int   @map("idLogo") @db.UnsignedSmallInt
  lat             Float @default(0) @db.Float
  lng             Float @default(0) @db.Float
  logo            Logo  @relation(fields: [logoID], references: [logoID], onUpdate: Restrict, map: "MiniProd_Loga")
  store           Store? @relation(fields: [storePositionID], references: [storePositionID], onDelete: Cascade, map: "prod_miniprod")

  @@index([logoID], map: "Logo_idx")
}

model Store {
  storeID         Int            @id @map("idProd") @db.UnsignedSmallInt
  name            String         @map("Prodejna") @db.VarChar(60)
  storePositionID Int?           @unique(map: "idMiniprod_UNIQUE") @map("idMiniprod") @db.UnsignedInt
  shortNumber     Int            @map("PKod") @db.UnsignedInt
  storePosition   MiniStore?     @relation(fields: [storePositionID], references: [storePositionID], map: "prod_miniprod")

  @@index([storePositionID], map: "prod_idMiniprod_idx")
}

关键修改点:

  • MiniStore的store字段添加?,支持未关联Store的MiniStore
  • 统一关系映射名称为prod_miniprod,与SQL外键约束保持一致
  • 保留Store的storePosition可选性,符合“并非所有Store都关联MiniStore”的需求

内容的提问来源于stack exchange,提问作者Akxe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:03:22