Лучший способ заменить стол - PullRequest
0 голосов
/ 28 августа 2018

У меня есть веб-приложение, работающее на основе таблицы базы данных, созданной из файла CSV.

Эта таблица должна часто обновляться из CSV. Таблица должна точно соответствовать csv, т. Е. Если запись больше не существует в csv, она больше не должна существовать в таблице или должна быть мягко удалена.

Как правильно это сделать?

Кажется, самый простой способ будет:

  1. создать временную таблицу
  2. импорт csv во временную таблицу
  3. drop live table
  4. переименование временной таблицы в имя действующей таблицы

Это будет написано в приложении, поэтому я не думаю, что время простоя будет таким большим, как удаление таблицы и переименование не должно занимать слишком много времени, но это не кажется самым безопасным способом сделать что-то, поскольку есть момент где нет таблицы.

Я попытался вместо этого сделать:

  1. создать временную таблицу
  2. импорт csv во временную таблицу
  3. обновить записи в оперативной таблице данными из временной таблицы
  4. удалить записи в реальной таблице, которые не существуют во временной таблице

Теоретически это звучало лучше, но очень медленно. Первый способ занимает всего несколько секунд. Второй способ - обновление занимает очень много времени. Я оставил его на 10 минут, прежде чем отменить его, так как оно не было завершено.

Я сделал обновление следующим образом:

update table_name as t
set
  column1 = t.column1,
  column2 = t.column2,
  -- etc..
from table_name_temp

Как правильно справиться с этой ситуацией?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Метод переименования таблицы работает только в том случае, если нет ограничений или триггеров.

В большинстве случаев содержимое новой таблицы не слишком сильно отличается от старой версии; хитрость в том, чтобы скрыть обновления, которые ничего не меняют.

По шагам:


  • создать временную таблицу
  • импорт csv во временную таблицу

  • удалить записи из реальной таблицы, которые не существуют во временной таблице # удаляет

  • удалить записи из временной таблицы , которые точно такие же, как в живой таблице # идемпотентные обновления
  • обновить записи в оперативной таблице данными из временной таблицы # актуально обновлено
  • вставка записей в временную таблицу из временной таблицы, которые еще не существуют # вставки
0 голосов
/ 28 августа 2018

То, что вы хотите сделать, - это обернуть ваше простое решение в транзакцию. Это гарантирует, что ваши шаги выполняются атомарно. Подробнее см. https://www.tutorialspoint.com/sql/sql-transactions.htm.

Поддержка Postgres ALTER TABLE .. RENAME.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...