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

