我需要对数据库连接表中的某些列执行简单的更新操作,但是,如果具有更新值的列已存在,我不想进行更新。
假设连接表看起来像这样:
_id | fkId
----------
1 | A
1 | B
2 | B
3 | C
3 | B
4 | A
- 我想将
fkId
为B
的所有条目更新为A
- 但是,每个条目必须是唯一的,因此,如果我已经将同一
_id
的另一个条目设置为fkId
A
,那么我不想进行更新,而是将其删除
我的更新目前如下所示:
UPDATE my_table
SET "fkId"='A'
WHERE "fkId"='B';
在上面的示例表中,您会看到 _id
1
条目,因此,如果我运行此查询,我最终会得到两个条目:
_id | fkId
----------
1 | A
1 | A
我不想要这个。每对都需要是唯一的,因此必须将其删除。我怎样才能通过查询实现这种情况?
最佳答案
另外使用不存在
条件:
UPDATE my_table AS t
SET "fkId"='A'
WHERE "fkId"='B' AND NOT EXISTS (
SELECT 1 from my_table WHERE _id=t._id AND "fkId" = 'A');
然后,如果您想删除未更新的行 - 只需这样做:
DELETE FROM my_table WHERE "fkId" = 'B';
为了避免这两个查询之间的并行 session 的干扰,您可能需要先锁定行:
SELECT * FROM my_table WHERE "fkId" = 'B' FOR UPDATE;
所以你的整个语句序列可能是:
BEGIN;
SELECT * FROM my_table WHERE "fkId" = 'B' FOR UPDATE;
UPDATE my_table AS t
SET "fkId"='A'
WHERE "fkId"='B' AND NOT EXISTS (
SELECT 1 from my_table WHERE _id=t._id AND "fkId" = 'A');
DELETE FROM my_table WHERE "fkId" = 'B';
COMMIT;
关于sql - 仅当相同值的列不存在时 Postgres 才更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61019584/