PostgreSQL v7.4 ALTER TABLE для изменения столбца - PullRequest
0 голосов
/ 30 ноября 2009

Мне нужно изменить длину столбцов CHAR в таблицах в базе данных PostgreSQL v7.4. Эта версия не поддерживала возможность прямого изменения типа или размера столбца с помощью инструкции ALTER TABLE. Так, например, прямое изменение столбца с CHAR (10) на CHAR (20) невозможно (да, я знаю, «использовать varchars», но это не вариант в моих текущих обстоятельствах). Кто-нибудь есть какие-либо советы / хитрости о том, как лучше всего это сделать? Мои первые мысли:

- сохранить данные таблицы в новой таблице «сохранить». CREATE TABLE save_data AS SELECT * FROM table_to_change;

- опустить столбцы из первого столбца, который нужно изменить, вниз. ALTER TABLE table_to_change DROP column_name1; - для каждого столбца, начиная с первого, который необходимо изменить ALTER TABLE table_to_change DROP column_name2; ...

- добавить столбцы обратно, используя новый размер для столбца CHAR ALTER TABLE table_to_change ADD column_name1 CHAR (new_size); - для каждого столбца, опущенного выше ALTER TABLE table_to_change ADD column_name2 ...

- скопировать базу данных из таблицы "save" ОБНОВЛЕНИЕ table_to_change SET column_name1 = save_data.column_name1, - для каждого столбца, удаленного / прочитанного выше column_name2 = save_date.column_name2, ... FROM save_data WHERE table_to_change.primary_key = save_data.primay_key;

Тьфу! Надеюсь, есть лучший способ? Любые предложения приветствуются. Спасибо!

Ответы [ 3 ]

2 голосов
/ 30 ноября 2009

Не PostgreSQL, но в Oracle я изменил тип столбца на:

  1. Добавить новый столбец с временным именем (т.е.: TMP_COL) и новым типом данных (например, CHAR(20))
  2. выполнить запрос на обновление: UPDATE TBL SET TMP_COL = OLD_COL;
  3. Дроп OLD_COL
  4. Переименовать TMP_COL в OLD_COL
1 голос
/ 30 ноября 2009

Лучший подход к вашей проблеме - обновить pg до чего-то менее архаичного:)

Серьезно. 7.4 будет удален из «поддерживаемых версий» довольно скоро, поэтому я бы не стал ждать, пока это произойдет с 7.4 в рабочей среде.

1 голос
/ 30 ноября 2009

Я бы вывел содержимое таблицы в плоский файл с помощью COPY, удалил таблицу, заново создал ее с правильной настройкой столбца, а затем перезагрузил (снова с COPY).

http://www.postgresql.org/docs/7.4/static/sql-copy.html

Допустимо ли иметь время простоя при выполнении этой операции? Очевидно, что то, что я только что описал, требует, чтобы таблица была непригодной для использования в течение определенного периода времени, как долго зависит от размера данных и оборудования, с которым вы работаете.

Редактировать: Но COPY немного быстрее, чем INSERT и UPDATE. Согласно документам, вы можете сделать это еще быстрее, используя режим BINARY. BINARY делает его менее совместимым с другими установками PGSQL, но вам это не нужно, потому что вы хотите загружать данные только в тот же экземпляр, из которого вы их выгружали.

...