PostgreSQL中使用ANY子句执行DELETE操作结果不符合预期如何修正
问题根因
你的写法错误来自对PostgreSQL中ANY运算符的语义理解偏差:
!= ANY(数组)的判定逻辑是:只要字段值不等于数组中任意一个元素,就返回真
比如eId = 'pqr'时,和数组里的'xyz'对比满足!=,所以整个条件为真,该行会被误删- 你需要的「字段值不等于数组内所有元素」逻辑,对应的运算符是
!= ALL(数组),也可以写为等价的NOT eId = ANY(数组)
修正后的SQL语句
DELETE FROM TABLE_A WHERE rId = 1 AND oId = 'abc' AND eId != ALL (array['pqr'::uuid, 'xyz'::uuid]);
两种等价写法性能完全一致,可按自己的阅读习惯选择。
Go代码修改
仅需要调整SQL模板中的运算符即可,参数传递逻辑无需改动:
func queryToDelete(req someReq, eIds ...string) *pgx.Batch { batch := &pgx.Batch{} deleteQuery := ` DELETE FROM table_a WHERE rId = $1 AND oId = $2 AND eId != ALL($3); ` batch.Queue(deleteQuery, req.rId, req.oId, eIds) return batch }
内容的提问来源于stack exchange,提问作者GopherGopher
相关产品推荐
相关产品推荐

