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

如何通过WHERE与IN子句基于复合主键执行DELETE操作?

问题解答

你的猜测完全正确。

为什么第二个删除语句会误删数据?

你写的语句:

delete from x where name in("a", "b") and group in(1, 2)

会匹配所有name为"a"或"b",同时group为1或2的行,也就是会包含以下四组主键配对:

  • ("a", 1)
  • ("a", 2)
  • ("b", 1)
  • ("b", 2)

这显然超出了你原本要删除的前三组范围,确实会误删("b", 2)这类非预期的行。

正确的删除写法

如果你的数据库支持行构造器语法(比如PostgreSQL、MySQL 8.0+等),可以直接用类似你最初尝试的写法(注意语法细节):

delete from x where (name, group) in (('a', 1), ('a', 2), ('b', 1));

这种写法会精确匹配你指定的主键组合,不会出现误删。

如果数据库不支持行构造器,也可以用多个OR条件来明确指定要删除的主键对:

delete from x 
where (name = 'a' and group = 1)
   or (name = 'a' and group = 2)
   or (name = 'b' and group = 1);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:54:52