Изменить сортировку и распределение для зависимых таблиц - PullRequest
0 голосов
/ 23 мая 2018

Это запрос на изменение ключа сортировки и расстояния в таблицах Redshift.

CREATE TABLE new_dummy 
  DISTKEY (id)
  SORTKEY (account_id,created_at)
  AS (SELECT * FROM dummy);

ALTER TABLE dummy RENAME TO old_dummy;
ALTER TABLE new_dummy RENAME TO dummy;
DROP TABLE old_dummy;

Выдает следующую ошибку:

ОШИБКА: невозможно удалить таблицу old_dummy, поскольку другиеобъекты зависят от него. СОВЕТ: используйте DROP ... CASCADE, чтобы удалить и зависимые объекты.

Так нельзя ли изменить ключи для зависимых таблиц?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

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

Учитывая эту ситуацию, я бы рекомендовал вам загрузитьданные следующие:

  • Начало транзакции
  • DELETE * из таблицы
  • Загрузка данных с помощью INSERT INTO
  • Завершение транзакции

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

Однако это оставляет таблицу в некотором беспорядочном состоянии, требуя VACUUM для удаления старых данных..

В качестве альтернативы вы можете:

  • TRUNCATE таблица
  • Загрузить данные с помощью INSERT INTO

TRUNCATEне требует очистки, поскольку очищает все данные, связанные с таблицей (а не просто помечает ее для удаления).Однако TRUNCATE немедленно фиксирует транзакцию, поэтому будет пробел, когда таблица будет пустой.

0 голосов
/ 23 мая 2018

Похоже, что у вас есть VIEW, которые ссылаются на исходную (dummy) таблицу.

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

Вам необходимо отбросить представление перед удалением таблицы.Затем вы можете воссоздать представление , чтобы указать на новую dummy таблицу.

Итак, поток будет:

  • Создать new_dummy и загрузитьdata
  • Drop view
  • Drop dummy
  • Переименовать new_dummy в dummy
  • Создать представление

Вы можете подумать, что это плохо, но на самом деле это хорошая функция, потому что переименование таблицы не нарушит никаких представлений.Представление автоматически останется с правильной таблицей.

ОБНОВЛЕНИЕ:

На основании комментария Джо ниже поток будет:

  • СОЗДАТЬ ВИД ... БЕЗ СВЯЗИ СХЕМЫ

Затем для каждой перезагрузки:

  • Создать new_dummy и загрузить данные
  • Удалить dummy
  • Переименование new_dummy в dummy
...