如何在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
相关产品推荐
相关产品推荐

