sql - 仅当相同值的列不存在时 Postgres 才更新列

标签 sql postgresql

我需要对数据库连接表中的某些列执行简单的更新操作,但是,如果具有更新值的列已存在,我不想进行更新。

假设连接表看起来像这样:

_id | fkId
----------
1   | A
1   | B
2   | B
3   | C
3   | B
4   | A
  • 我想将 fkIdB 的所有条目更新为 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/

相关文章:

mysql - postgresql 中的 DATE_FORMAT

node.js - Nodejs,将 bin 文件作为 BYTEA 存储到 pgsql 中(损坏的文件)

Postgresql ORDER BY 没有按预期工作

postgresql - 结合其他列对 JSONB 键建立索引

sql - PL/pgSQL : finding all groups person belongs to (also indirectly)

mysql - 下载 MySQL 表作为电子表格

mysql - 删除时对 c :n with combined PK 的空字段设置空约束

MySQL如何填充范围内缺失的日期?

python - SQLAlchemy:使用两个 MySQL 模式中的表进行查询

mysql - 如何在 SET 子查询中引用外表?