唯一约束在约束上失败:prisma 中的“User_Account_userId_key”
Unique constraint failed on the constraint: `User_Account_userId_key` in prisma
你好我有三个模型
model User {
user_id Int @id @default(autoincrement())
email String @unique
name String?
User_Account User_Account[]
}
model Account {
account_id Int @id @default (autoincrement()) @unique
email String
bank String
createdAt DateTime @default(now())
User_Account User_Account[]
}
model User_Account {
id Int @id @default(autoincrement())
accountId Int
userId Int
User User @relation(fields: [userId], references: [user_id])
Account Account @relation(fields: [accountId], references: [account_id])
}
我正在尝试像这样播种我的数据库
const data = [
{
id: 1,
email: 'pranit1@mf.com',
name: 'Pranit1',
bank: 'VCB',
ids: [1,1]
},
{
id: 2,
email: 'pranit1@mf.com',
name: 'Pranit1',
bank: 'ACB',
ids: [1,2]
},
{
id: 3,
email: 'pranit3@mf.com',
name: 'Pranit3',
bank: 'VCB',
ids: [2,3]
}
]
const users = await prisma.$transaction(
data.map(user =>
prisma.user.upsert({
where: { email: user.email },
update: {},
create: { name: user.name,
email:user.email },
})
)
);
const accounts = await prisma.$transaction(
data.map(account =>
prisma.account.upsert({
where: { account_id: account.id },
update: {},
create: { bank: account.bank ,
email :account.email },
})
)
);
const user_accounts = await prisma.$transaction(
data.map(uacc =>{
console.log(uacc);
return prisma.user_Account.upsert({
where: { id: uacc.id },
update: {id: uacc.id},
create:{
userId: uacc.ids[0],
accountId: uacc.ids[1] },
})}
)
);
但是我得到了
Unique constraint failed on the constraint: User_Account_userId_key
prisma studio中的数据生成如图
我只是想创建用户和帐户,一个用户可以与多个帐户相关联。他们的关系如User_Accounttable所示。当我在 userId
上没有 @unique 标签时,我不明白为什么我会收到唯一约束错误
我无法重现我这边的错误。
但我怀疑您已经在数据库上有记录,并且它们与您的播种机的 ID 冲突。
此外,您可以对架构进行一些改进以使其更简单。
- 由于您没有关于多对多关系的任何额外细节,您可以摆脱 User_Account 模型并让 Prisma 为您处理。
- 在播种机上,您可以利用 Prisma 的嵌套功能,这样您就不必手动 link 记录。这样,您就不必担心 ID。
schema.prisma 建议
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
accounts Account[]
}
model Account {
id Int @id @unique @default(autoincrement())
email String
bank String
users User[]
createdAt DateTime @default(now())
}
seed.js 建议
const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();
async function main() {
const usersData = [
{
email: "pranit1@mf.com",
name: "Pranit1",
banks: ["VCB", "ACB"],
},
{
email: "pranit3@mf.com",
name: "Pranit3",
banks: ["VCB"],
},
];
const users = await prisma.$transaction(
usersData.map((user) =>
prisma.user.upsert({
where: { email: user.email },
update: {},
create: {
name: user.name,
email: user.email,
accounts: {
create: user.banks.map((bank) => ({
email: user.email,
bank,
})),
},
},
})
)
);
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
你好我有三个模型
model User {
user_id Int @id @default(autoincrement())
email String @unique
name String?
User_Account User_Account[]
}
model Account {
account_id Int @id @default (autoincrement()) @unique
email String
bank String
createdAt DateTime @default(now())
User_Account User_Account[]
}
model User_Account {
id Int @id @default(autoincrement())
accountId Int
userId Int
User User @relation(fields: [userId], references: [user_id])
Account Account @relation(fields: [accountId], references: [account_id])
}
我正在尝试像这样播种我的数据库
const data = [
{
id: 1,
email: 'pranit1@mf.com',
name: 'Pranit1',
bank: 'VCB',
ids: [1,1]
},
{
id: 2,
email: 'pranit1@mf.com',
name: 'Pranit1',
bank: 'ACB',
ids: [1,2]
},
{
id: 3,
email: 'pranit3@mf.com',
name: 'Pranit3',
bank: 'VCB',
ids: [2,3]
}
]
const users = await prisma.$transaction(
data.map(user =>
prisma.user.upsert({
where: { email: user.email },
update: {},
create: { name: user.name,
email:user.email },
})
)
);
const accounts = await prisma.$transaction(
data.map(account =>
prisma.account.upsert({
where: { account_id: account.id },
update: {},
create: { bank: account.bank ,
email :account.email },
})
)
);
const user_accounts = await prisma.$transaction(
data.map(uacc =>{
console.log(uacc);
return prisma.user_Account.upsert({
where: { id: uacc.id },
update: {id: uacc.id},
create:{
userId: uacc.ids[0],
accountId: uacc.ids[1] },
})}
)
);
但是我得到了
Unique constraint failed on the constraint:
User_Account_userId_key
prisma studio中的数据生成如图
我只是想创建用户和帐户,一个用户可以与多个帐户相关联。他们的关系如User_Accounttable所示。当我在 userId
上没有 @unique 标签时,我不明白为什么我会收到唯一约束错误我无法重现我这边的错误。 但我怀疑您已经在数据库上有记录,并且它们与您的播种机的 ID 冲突。 此外,您可以对架构进行一些改进以使其更简单。
- 由于您没有关于多对多关系的任何额外细节,您可以摆脱 User_Account 模型并让 Prisma 为您处理。
- 在播种机上,您可以利用 Prisma 的嵌套功能,这样您就不必手动 link 记录。这样,您就不必担心 ID。
schema.prisma 建议
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
accounts Account[]
}
model Account {
id Int @id @unique @default(autoincrement())
email String
bank String
users User[]
createdAt DateTime @default(now())
}
seed.js 建议
const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();
async function main() {
const usersData = [
{
email: "pranit1@mf.com",
name: "Pranit1",
banks: ["VCB", "ACB"],
},
{
email: "pranit3@mf.com",
name: "Pranit3",
banks: ["VCB"],
},
];
const users = await prisma.$transaction(
usersData.map((user) =>
prisma.user.upsert({
where: { email: user.email },
update: {},
create: {
name: user.name,
email: user.email,
accounts: {
create: user.banks.map((bank) => ({
email: user.email,
bank,
})),
},
},
})
)
);
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});