仅当所有行都存在时才更新多行

时间:2020-02-23 18:00:17

标签: sql postgresql go-pg

仅当数据库中所有行都存在时,我才想更新多行,这怎么办?

在这种情况下,如果不存在任何书籍,则不会阻止另一本书进行更新。

books表如下:

id PK
title VARCHAR

假设我们在数据库中只存储了一本书:

id: 1
title: "A simple title"

如果我要更新2本书,而其中1本书没有存储在数据库中,我想取消整个更新过程-保留表格不做任何更改。

以下查询不应更新任何内容:

UPDATE "books" AS "book"
SET "title" = _data."title"
FROM (VALUES ('updated book 1', 1), ('updated book 2', 2)) AS _data("title", "id")
WHERE "book"."id" = _data."id"

是否可以在不使用事务的情况下实现这一目标?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

哦,我明白了。首先计算比赛数如何?

WITH bb as (
      SELECT v.*
      FROM (VALUES ('updated book 1', 1),
                   ('updated book 2', 2)
           ) v(title, id) 
     )
UPDATE books b
    SET title = b.title
    FROM bb CROSS JOIN
         (select count(*) as cnt, count(b.id) as b_cnt
          from bb left join
               books b
               using (id)
         ) bb
     WHERE bb.id = b.id AND
           bb.cnt = b.b_cnt;

请注意,我删除了所有那些讨厌的双引号。带引号的标识符不是一个好主意。

相关问题