0

我正在尝试使用该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)

假设此表具有以下行 -

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

我想从该表中删除所有具有rId = 1, oId = abcAND [ eId != pqrAND 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作为eId参数传递给运行此查询的 go 函数的参数)。

像下面的东西 -

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

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

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

    return batch
}

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

4

1 回答 1

1

正如 The Impaler 在他们的评论中指出的那样,如果数组是一个包含多个元素的集合,eId != ANY ($3)总是会评估。true$3

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

于 2021-09-03T13:43:11.600 回答