DELETE with ANY 子句未按预期工作

DELETE with ANY clause not working as expected

我正在尝试使用 ANY 子句删除我的 Postgress 数据库中的某些行。

结构如下-

---- TABLE A -----
-------------------
rId UUID NOT NULL,
oId UUID NOT NULL,
eId UUID NOT NULL,
--- <other fields>
PRIMARY KEY (rId, oId, eId),
CONSTRAINT fk_r FOREIGN KEY (rId) REFERENCES another_table(rId),
CONSTRAINT fk_eo FOREIGN KEY (oId, eId) REFERENCES some_other_table (oId, eId)

假设此 table 有以下行 -

|  rId  | oId  |  eId  |
-----------------------
|   1   |  abc |  pqr  |
|   1   |  abc |  xyz  |
|   1   |  abc |  utd  |

我想删除此 table 中具有 rId = 1oId = abc AND [eId != pqr AND eid != xyz]

的所有行

我写了下面的查询 -

DELETE FROM TABLE_A
WHERE   rId = 1
    AND oId = abc
    AND eId != ANY (array['pqr'::uuid, 'xyz'::uuid]);

问题是这不起作用。具有 eId = pqr Or eId = xyz 的两行都被删除了。 我该如何纠正?

一个一个地传递它们不是一个选项(我得到一个 slice of eId ,我将它作为参数传递给运行此查询的 go 函数)。

类似下面的内容 -

func queryToDelete(req someReq, eIds ...string) *pgx.Batch {
    batch := &pgx.Batch{}

    deleteQuery := `
        DELETE
        FROM table_a
        WHERE rId = 
            AND oId = 
            AND eId != ANY();
        `

    batch.Queue(deleteQuery, req.rId, req.oId, eIds)

    return batch
}

请忽略 1abcpqr 在此示例中不是 UUID。为了简洁起见,我保持这种方式。

正如 Impaler 在他们的评论中指出的那样,如果 </code> 数组是一个包含多个元素的集合,<code>eId != ANY () 将始终计算为 true

对于您的用例,您应该改用 ALL,例如eId != ALL ().