mysql findMany有效但deleteMany无效

pzfprimi  于 2022-11-28  发布在  Mysql
关注(0)|答案(1)|浏览(112)

我有一个简单的 Note 表和一个具有隐式多对多关系的 Tag 表。

model Tag {
  id    Int    @id @default(autoincrement())
  tag   String @unique
  notes Note[]
}

model Note {
  id    Int    @id @default(autoincrement())
  note  String @unique
  tags  Note[]
  ...
}

当我删除一个笔记,我想删除的标签,这是只有在该笔记。我写道:

await prisma.tag.deleteMany({
    where: {
      notes: { none: { tags: { some: { tag: { in: tags } } } } }, // tags: string[] coming from deleted note
    },
  });

但它给了我错误:

ConnectorError(ConnectorError { user_facing_error: None, kind: QueryError(Server(ServerError { code: 1093, message: "You can't specify target table 'Tags' for update in FROM clause", state: "HY000" })) })

但是当我把它修改成findMany时,它找到它们没有任何问题。问题是什么?
目前我正在对findMany中的数据运行另一个deleteMany。我读到在纯SQL中可以用另一个SELECT将其 Package 起来,但是在prisma中我可以做些什么呢?

zujrkrfu

zujrkrfu1#

我找了很多才找到这个。
你的问题是来自mysql,我尝试与postgresql,我不能重现它.
但碰巧有个解决办法。
新的prisma查询如下所示:

await prisma.tag.deleteMany({
  where: {
    // Search tag with no notes
    notes: { none: {} },
    // and in your list
    tag: { in: tags }
  },
});

EDIT实际上,如果您不希望任何未链接到笔记的标记,您只能

await prisma.tag.deleteMany({
  where: {
    notes: { none: {} },
  },
});

因为它会搜索所有没有注解链接的标签。唯一的问题是,它会检查Tag表中的所有标签,因此效率并不高

为了解释更多

使用模拟表
Relationship Note / Tag表格:

╔═════════╦════════╗
║ node_id ║ tag_id ║
╠═════════╬════════╣
║ Note1   ║ Tag1   ║
║ Note1   ║ Tag2   ║
║ Note2   ║ Tag2   ║
║ Note3   ║ Tag3   ║
║ Note4   ║        ║
║ Note5   ║        ║
║         ║ Tag4   ║
║         ║ Tag5   ║
║         ║ Tag6   ║
║         ║ Tag7   ║
╚═════════╩════════╝

Note表格

╔═══════╦══════╗
║  id   ║ note ║
╠═══════╬══════╣
║ Note1 ║ a    ║
║ Note2 ║ b    ║
║ Note3 ║ c    ║
║ Note4 ║ d    ║
║ Note5 ║ e    ║
╚═══════╩══════╝

第一例

添加过滤器notes: { none: {} }时,您要求Prisma查找没有注解的每个标签,因此Relationship Note / Tag表中没有关系
因此,使用此筛选器查找多个:

const tags = await prisma.tag.findMany({
  where: {
    notes: { none: {} },
  },
});

tags将包含id为Tag4Tag5Tag6Tag7的标签,因为它们与任何注解都不相关

第二种情况

当您执行notes: { none: { note: 'a' } }时,您要求Prisma查找没有note值= a的注解的任何标签
因此,使用此筛选器查找多个:

const tags = await prisma.tag.findMany({
  where: {
    notes: { none: { note: 'a' } },
  },
});

tags将包含除Tag1Tag2之外的所有标记,这两个标记与Note1相关,且note值= a

结束编辑

“告诉你”"你没做你想做的事“
x1米20英寸
您要求搜索tags,其中笔记的标签中没有tags
所以如果你有这些关系

╔═════════╦════════╗
║ node_id ║ tag_id ║
╠═════════╬════════╣
║ Note1   ║ Tag1   ║
║ Note1   ║ Tag2   ║
║ Note2   ║ Tag3   ║
║ Note3   ║ Tag3   ║
╚═════════╩════════╝

您删除Note3,然后使用此查询搜索Tag3,链接到Note2的Tag3确实包含一些Tag3,因此未删除,但Tag2没有包含一些Tag3的注解,因此将其删除,对于Tag1也是如此

相关问题