вторник, 25 января 2011 г.

Postgres Внесение изменений в тип ENUM

Как оказалось в Postgres внести изменения в перечислимый тип ENUM не так то просто! В Postgres ENUM это именно создаваемый пользователем новый тип данных, который можно использовать сразу в нескольких таблицах. Состоит он из статических упорядоченных списков. Тип занимает 4 байта на диске, а текстовая метка зависит от настроек (параметр NAMEDATALEN), по умолчанию 63 бита.


Говорят что в версии 9.1 всё решается в одну строчку

ALTER TYPE name ADD VALUE new_enum_value [ { BEFORE | AFTER } existing_enum_value ]

а всем у кого версии помладше приходится фантазировать. Вот один из приемлемых вариантов:

-- 1. Переименуйте тот тип ENUM который вы хотите дополнить
ALTER TYPE b_status RENAME TO old_b_status;
-- 2. Создайте новый тип
CREATE TYPE b_status AS ENUM ('exposed','paid','canceled');
-- 3. Переименуйте столбец, который использует ваш старый тип
ALTER TABLE bills RENAME COLUMN status TO old_status;
-- 4. Создайте новый столбец с новым типом
ALTER TABLE bills ADD status b_status NOT NULL DEFAULT 'exposed';
-- 5. Скопируйте значения в новый столбец
UPDATE bills SET status = old_status::text::b_status;
-- 6. Удалите старый столбец и тип
ALTER TABLE bills DROP COLUMN old_status;
DROP TYPE old_b_status;

ps: для сравнения полей с разными перечислимыми типами в Postgres приходится явно приводить эти поля к типу текст с помощью метода ::text

Комментариев нет:

Отправить комментарий