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 = 1
、oId = 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
}
请忽略 1
、abc
、pqr
在此示例中不是 UUID。为了简洁起见,我保持这种方式。
正如 Impaler 在他们的评论中指出的那样,如果 </code> 数组是一个包含多个元素的集合,<code>eId != ANY ()
将始终计算为 true
。
对于您的用例,您应该改用 ALL
,例如eId != ALL ()
.
我正在尝试使用 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 = 1
、oId = 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
}
请忽略 1
、abc
、pqr
在此示例中不是 UUID。为了简洁起见,我保持这种方式。
正如 Impaler 在他们的评论中指出的那样,如果 </code> 数组是一个包含多个元素的集合,<code>eId != ANY ()
将始终计算为 true
。
对于您的用例,您应该改用 ALL
,例如eId != ALL ()
.