0

我只想在数据库中都存在多行的情况下更新多行,如何做到这一点?

在这种情况下,如果任何一本书不存在,它不会阻止另一本书的更新。

books表如下所示:

id PK
title VARCHAR

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

id: 1
title: "A simple title"

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

下面的查询应该什么都不更新:

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"

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

提前感谢您的帮助!

4

1 回答 1

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;

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

于 2020-02-23T18:02:47.443 回答