Как удалить значение типа перечисления, созданное в postgresql?
create type admin_level1 as enum('classifier', 'moderator', 'god');
Например, я хочу удалить moderator
из списка.
Кажется, я ничего не могу найти в документации.
Я использую Postgresql 9.3.4.
postgresql
enums
Амджит
источник
источник
drop type admin_level1
?create xxx
естьdrop xxx
Ответы:
Вы удаляете (отбрасываете) типы перечислений, как и любой другой тип, с помощью
DROP TYPE
:Возможно ли, что вы действительно спрашиваете, как удалить отдельное значение из типа перечисления ? Если так, то не получится. Не поддерживается :
Вы должны создать новый тип без значения, преобразовать все существующие варианты использования старого типа для использования нового типа, а затем отказаться от старого типа.
Например
источник
(psycopg2.InternalError) ALTER TYPE ... ADD cannot run inside a transaction block
Здесь очень хорошо написано:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
переименовать существующий тип
создать новый тип
обновить столбцы, чтобы использовать новый тип
удалить старый тип
источник
Если вы хотите удалить элемент типа enum, вы должны работать с системной таблицей PostgreSQL.
С помощью этой команды вы можете отобразить все типы перечисления элементов.
ВЫБРАТЬ * ИЗ pg_enum;
Затем убедитесь, что найденное значение уникально. Для увеличения уникальности при удалении рекору необходимо передать enumtypid в дополнение к enumlabel.
Эта команда удаляет запись в типе перечисления, где «уникальный» - ваше значение.
УДАЛИТЬ ИЗ pg_enum en WHERE en.enumtypid = 124 AND en.enumlabel = 'unique';
ПРИМЕЧАНИЕ . Пример, который я описал, должен использоваться, когда мы случайно добавляем новое значение в тип перечисления, но мы еще не использовали его нигде в базе данных.
источник
ERROR: invalid internal value for enum
и выход NO результатов.)DELETE FROM pg_enum en WHERE en.enumtypid=124 AND en.enumlabel='unigue';
ПРИМЕЧАНИЕ должно быть выделено жирным шрифтом, а не команда. Если вы использовали значение из какой-либо таблицы, вы не можете восстановить его. Вы не можете обновить строки, содержащие значение, вы не можете преобразовать. Единственный способ - удалить всю строку.Для тех, кто хочет изменить значения перечисления, его воссоздание кажется единственным жизнеспособным и безопасным решением.
Он состоит во временном преобразовании столбца перечисления в строковый формат, воссоздании перечисления и последующем преобразовании строкового столбца обратно в тип перечисления.
Вот пример:
источник
ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_enum_name::your_schema.your_column;
должно бытьALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_schema.your_column::your_enum_name;
Используйте следующий запрос для удаления значения ENUM из типа Postgresql
Просто информация о том, какой тип и какое значение
Вам следует изменить существующие значения на другие. Для этого, если вам нужно добавить новое значение, используйте:
Перед удалением обновите значение типа до нового значения типа или существующего значения.
источник
SELECT oid FROM pg_type WHERE typname = 'enum_type'
Программный способ сделать это следующий. Уместны те же общие шаги, что и в https://stackoverflow.com/a/47305844/629272 , но они скорее ручные, чем имеют смысл для моих целей (написание перегонной миграции вниз).
my_type
,,my_type_old
иvalue_to_delete
, конечно, должны быть изменены соответствующим образом.Переименуйте свой тип.
Создайте новый тип со значениями из вашего старого типа, исключая тот, который вы хотите удалить.
Измените все существующие столбцы, которые используют старый тип, чтобы использовать новый.
Удалите старый тип.
источник
если ваш набор данных не такой большой, вы можете сделать дамп,
--column-inserts
отредактировав дамп с помощью текстового редактора, удалите значение и повторно импортируйте дамписточник
Была такая же проблема в версии 10. postgres. Для удаления требуются определенные процедуры, и если последовательность неверна, то есть вероятность того, что таблица будет заблокирована для чтения.
Написал удобный скрипт для удаления. Уже несколько раз доказана его работоспособность. Однако эта процедура включает замену удаленного значения новым (оно может иметь значение NULL, если поле таблицы позволяет это).
Для использования вам просто нужно ввести 3 значения.
источник
Невозможно удалить отдельное значение из ENUM, единственное возможное решение - DROP и воссоздать ENUM с необходимыми значениями.
источник
DELETE FROM pg_enum WHERE enumlabel='saml' AND enumsortorder=4;