Удалите одно значение перечисления в postgres - PullRequest
1 голос
/ 26 июня 2019

Скажите, у меня есть следующее перечисление:

CREATE TYPE "my_enum" AS ENUM('value1', 'value2', 'value3');

Я хотел бы получить удалить value3.Из того, что я вижу в документации и в предыдущих темах, я фактически должен отбросить все перечисление и воссоздать его с нужными мне значениями.Примерно так:

DROP TYPE IF EXISTS "my_enum";

CREATE TYPE "my_enum" AS ENUM('value1', 'value2');

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

ОШИБКА: невозможно удалить тип "my_enum", потому что от него зависят другие объекты

Так что мой вопрос: как я могу удалитьодно из значений перечислений, не отбрасывая все это?Я знаю, что могу легко добавить значения, просто изменив:

ALTER TYPE "my_enum" ADD VALUE 'value4';

Так что я думаю, что я мог бы сделать что-то подобное при удалении.

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Хм, хотя это действительно ДЕЙСТВИТЕЛЬНО не рекомендуется, есть способ добиться этого, если у вас есть права на это:

SELECT 
    t.typname,
    e.enumlabel,
    e.enumtypid
FROM pg_type t
JOIN pg_enum e ON e.enumtypid = t.oid
WHERE t.typname = '<your enum name>'

Это дает вам внутренний идентификатор dbms enumtypid перечислениявведите.

С этим вы можете сделать удаление:

DELETE FROM pg_enum
WHERE enumtypid = <your enumtypid>
    AND enumlabel = '<enum value to delete>'

Перед этим вы должны убедиться, что вы больше не используете значение.В противном случае ваш стол может испортиться!

1 голос
/ 26 июня 2019

Вы должны отбросить тип, однако вы можете временно изменить таблицы, содержащие столбцы типа.

Пример модели:

create type my_enum as enum('apple', 'pear', 'banana');
create table my_table(id serial primary key, my_col my_enum);
insert into my_table (my_col) values
    ('apple'),
    ('pear');

Удалить banana из типа enum:

alter table my_table alter my_col type text;
drop type my_enum;
create type my_enum as enum('apple', 'pear');
alter table my_table alter my_col type my_enum using my_col::my_enum;

Проверка:

select * from my_table;

 id | my_col 
----+--------
  1 | apple
  2 | pear
(2 rows)    
...