Мне нужно обновить таблицу из другой, и мне нужно обновить все столбцы. Помимо перечисления каждого столбца в SET
предложении, есть ли способ обновить их все сразу? Как это:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id
Я пытался в PSQL, это не работает. Я должен перечислить каждый столбец следующим образом:
update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id
tableB
создан для использования create .. like tableA
. Так что они в основном идентичны. И причина, по которой я это делаю, заключается в том, что мне нужно загрузить данные .csv во временную таблицу, tableB
а затем обновить их tableA
на основе новых данных tableB
. tableA
должен быть как можно меньше заблокирован и tableA
должен сохранять целостность. Я не уверен, что «удалить, а затем вставить» будет хорошим вариантом?
postgresql
update
odieatla
источник
источник
Ответы:
Не существует синтаксического варианта, который позволял бы обновлять всю строку сразу. Тем не менее, есть более короткая форма, чем у вас до сих пор.
Кроме того, вы не хотите обновлять все столбцы.
WHERE
Условие на Ид штифтах вниз по меньшей мере , одного столбца (id
) остается неизменным. Но это просто придирки.Подробнее в этом связанном ответе:
Массовое обновление всех столбцов
DELETE / INSERT
Внутренне, благодаря модели Postgres MVCC , каждый
UPDATE
эффективно вставляет новый ряд в любом случае и помечает старый как устаревший. Так что за занавесками нет большой разницы между плюсомUPDATE
иDELETE
плюсомINSERT
.Есть некоторые подробности в пользу
UPDATE
маршрута:В противном случае блокировка должна быть примерно такой же. В любом случае вам нужна эксклюзивная блокировка для затронутых рядов. Просто сделай это быстро.
Если вы имеете дело с огромным количеством строк и вам не нужно согласованное состояние (все строки или ни одного), вы можете разделить операцию на несколько пакетов. (Отдельные транзакции!) Увеличивает общую стоимость, но сокращает время блокировки на строку.
источник
DELETE / INSERT
может также иметь нежелательные или просто другие (каскадные или сработавшие) эффекты, чемUPDATE
.