SQL - обновить несколько таблиц, один и тот же столбец по одному запросу - PullRequest
1 голос
/ 23 апреля 2020

У меня есть postgres база данных

Есть 3 таблицы, я пытаюсь сделать оператор sql UPDATE, который обновляет столбец active в каждой таблице.

Таблица1 имеет запись поля, которая выглядит следующим образом:

table1_id: 40b77068-4693-4593-8ea9-996501414101
table1_name: Digital Only
active: false

Таблица2

table2_id: [some randomId we don't care about]
table1_fk: 40b77068-4693-4593-8ea9-996501414101
active: false

Таблица3 такая же, как таблица 2

table2_id: [some randomId we don't care about]
table1_fk: 40b77068-4693-4593-8ea9-996501414101
active: false

Мне нужно запрос, который ищет имя "Digital Only" и его идентификатор на table1. Обновление активно column. Обновите соответствующие active столбцы в 2 других таблицах, соответствующих исходному идентификатору в table1

. Таблицы имеют довольно длинные имена, поэтому в идеале я хочу присвоить им псевдонимы:

Пока у меня есть кое-что по строки этого в псевдокоде

UPDATE a.active, b.active, c.active
INNER JOIN
FROM table1 a, table2 b, table3 c
SET a.active=true, b.active=true, c.active=true
WHERE a.active=true, b.active=true, c.active=true

Не уверен, как это сделать. Табличные отношения выглядят так: enter image description here

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Один оператор обновления может обновлять только 1 таблицу за раз, поэтому есть три способа сделать это:

  1. чтобы ваше приложение просматривало информацию, а затем упаковывало 3 обновления в одну транзакцию
  2. использовать хранимую процедуру для реализации логики поиска / обновления c (тогда вашему приложению требуется только один вызов)
  3. воспроизвести некоторые SQL трюки, обернув 3 оператора обновления в общее табличное выражение. это самый «умный» способ сделать это.
1 голос
/ 23 апреля 2020

Я думаю, это делает то, что вы хотите. Идея заключается в первом обновлении table1 и использовании предложения returning для возврата table1_id, который можно использовать для update двух других таблиц:

with 
    t1 as (
        update table1
        set active = true
        where table1_name = 'Digital Only'
        returning table1_id
    ),
    t2 as (
        update table2
        set active = true
        from t1
        where table1_fk = t1.table1_id
    )
update table3
set active = true
from t1
where table1_fk = t1.table1_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...