Обновлять несколько строк, только если все они существуют - PullRequest
0 голосов
/ 23 февраля 2020

Я хотел бы обновить несколько строк, только если все они существуют в базе данных, как это можно сделать?

В этом случае, если какой-либо из книг не существует, это не останавливает другая будет обновлена.

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"

Можно ли этого добиться без использования транзакции?

Спасибо заранее за помощь!

1 Ответ

0 голосов
/ 23 февраля 2020

О, понятно. Как насчет подсчета совпадений в первую очередь?

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;

Обратите внимание, что я удалил все эти надоедливые двойные кавычки. Идентификаторы в кавычках не очень хорошая идея.

...