Изменение типа enum в postgres 8.1

Сообщение об ошибке

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls в функции menu_set_active_trail() (строка 2405 в файле /var/www/notes7/includes/menu.inc).

Postgres 9 поддерживает расширение собственного типа ENUM через ALTER TYPE, чего нет в postgres 8

Приходится делать так:

(для примера наш тип будет называться extype, колонки с этим типом у меня называются также)

1. Выбираем таблицы с колонками с названием extype

select table_name from information_schema.columns where column_name = 'extype';

2. Переименовываем старый тип

alter type extype rename to extype_old;

3. Создаем новый тип

CREATE TYPE extype AS ENUM ('value1', 'value2','valueN');

4. Переименовываем колонку с нашим старым типом

alter table some_table rename column extype to extype_old;

5. Создаем новую колонку с нашим типом

alter table some_table add extype extype;

6. Копируем значения из старой колонки в новую

update some_table set extype = extype_old::text::extype;

7. Если нужно, ставим ограничение на заполненность колонки и индексируем ее

alter table some_table alter column extype set not null;
CREATE INDEX iextype_some_table ON some_table (extype);

8. Удаляем старую колонку

alter table some_table drop column extype_old;

Операции 4-8 провести для всех таблиц, в которых имеется колонка со старым типом.
Представления (если имеются) придется пересоздавать.

Добавить комментарий

CAPTCHA