Como excluo um valor de tipo enum que criei no postgresql?
create type admin_level1 as enum('classifier', 'moderator', 'god');
Por exemplo, quero remover moderator
da lista.
Não consigo encontrar nada nos documentos.
Estou usando o Postgresql 9.3.4.
postgresql
enums
Amjith
fonte
fonte
drop type admin_level1
?create xxx
há umdrop xxx
Respostas:
Você exclui (elimina) tipos de enum como qualquer outro tipo, com
DROP TYPE
:É possível que você esteja realmente perguntando sobre como remover um valor individual de um tipo de enum ? Se sim, você não pode. Não é compatível :
Você deve criar um novo tipo sem o valor, converter todos os usos existentes do tipo antigo para usar o novo tipo e, em seguida, eliminar o tipo antigo.
Por exemplo
fonte
(psycopg2.InternalError) ALTER TYPE ... ADD cannot run inside a transaction block
Muito bem escrito aqui:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
renomear o tipo existente
crie o novo tipo
atualize as colunas para usar o novo tipo
remova o tipo antigo
fonte
Se você deseja excluir um item do tipo enum, deve operar na tabela de sistema do PostgreSQL.
Com este comando, você pode exibir todos os tipos de enum de itens.
SELECT * FROM pg_enum;
Em seguida, verifique se o valor pesquisado é único. Para aumentar a exclusividade durante a remoção do rekoru, deve ser passado 'enumtypid' além de 'enumlabel'.
Este comando remove a entrada no tipo enum, onde 'exclusivo' é o seu valor.
DELETE FROM pg_enum pt WHERE en.enumtypid = 124 AND en.enumlabel = 'único';
NOTA O exemplo que descrevi deve ser usado, quando por acaso adicionamos um novo valor ao tipo enum, e ainda não o usamos em nenhum lugar do banco de dados.
fonte
ERROR: invalid internal value for enum
e NÃO produzirá resultados.)DELETE FROM pg_enum en WHERE en.enumtypid=124 AND en.enumlabel='unigue';
A NOTA deve estar em NEGRITO, não o comando. Se você usou o valor em alguma tabela, você não pode recuperá-lo. Você não pode atualizar as linhas que contêm o valor, você não pode converter. A única maneira é excluir a linha inteira.Para aqueles que desejam modificar os valores de enum, recriá-los parece ser a única solução viável e segura.
Consiste em converter temporariamente a coluna enum em um formato de string, recriar o enum e então reconverter a coluna de string de volta para o tipo enum.
Aqui está um exemplo:
fonte
ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_enum_name::your_schema.your_column;
deveria serALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_schema.your_column::your_enum_name;
Use a seguinte consulta para excluir o valor ENUM do tipo Postgresql
Apenas informações sobre o tipo e o valor
Você deve alterar os valores existentes para outros. Para isso, se você precisar adicionar um novo valor, use:
Antes de excluir, atualize o valor do tipo para o novo valor do tipo ou valor existente.
fonte
SELECT oid FROM pg_type WHERE typname = 'enum_type'
A maneira programática de fazer isso é a seguinte. As mesmas etapas gerais fornecidas em https://stackoverflow.com/a/47305844/629272 são apropriadas, mas são mais manuais do que faria sentido para os meus propósitos (escrever uma migração para baixo do alambique).
my_type
,,my_type_old
evalue_to_delete
, deve, é claro, ser alterado conforme apropriado.Renomeie seu tipo.
Crie um novo tipo com os valores do seu tipo antigo, excluindo aquele que você deseja excluir.
Altere todas as colunas existentes que usam o tipo antigo para usar o novo.
Exclua o tipo antigo.
fonte
se o seu conjunto de dados não for tão grande, você pode despejar com
--column-inserts
editar o despejo com um editor de texto, remover o valor e reimportar o despejofonte
Tive o mesmo problema no v.10. postgres. A exclusão requer certos procedimentos e, se a sequência não estiver correta, haverá até uma chance de a tabela ser bloqueada para leitura.
Escreveu um script conveniente para excluir. Já provou várias vezes o seu desempenho. No entanto, este procedimento envolve a substituição do valor excluído por um novo (pode ser NULL se o campo da tabela permitir).
Para usar, você só precisa preencher 3 valores.
fonte
Não é possível excluir um valor individual de ENUM, a única solução possível é DROP e recriar ENUM com os valores necessários.
fonte
DELETE FROM pg_enum WHERE enumlabel='saml' AND enumsortorder=4;