Jak usunąć wartość typu wyliczenia, którą utworzyłem w postgresql?
create type admin_level1 as enum('classifier', 'moderator', 'god');
Np. Chcę usunąć moderator
z listy.
Nie mogę znaleźć niczego w dokumentach.
Używam Postgresql 9.3.4.
postgresql
enums
Amjith
źródło
źródło
drop type admin_level1
?create xxx
drop xxx
Odpowiedzi:
Usuwasz (upuszczasz) typy wyliczeń jak każdy inny typ, za pomocą
DROP TYPE
:Czy to możliwe, że faktycznie pytasz, jak usunąć indywidualną wartość z typu wyliczenia ? Jeśli tak, nie możesz. Nie jest obsługiwany :
Musisz utworzyć nowy typ bez wartości, przekonwertować wszystkie istniejące zastosowania starego typu na nowy typ, a następnie usunąć stary typ.
Na przykład
źródło
(psycopg2.InternalError) ALTER TYPE ... ADD cannot run inside a transaction block
Bardzo dobrze napisane tutaj:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
zmienić nazwę istniejącego typu
utwórz nowy typ
zaktualizuj kolumny, aby używały nowego typu
usuń stary typ
źródło
Jeśli chcesz usunąć element typu wyliczenia, musisz operować na tabeli systemowej PostgreSQL.
Za pomocą tego polecenia można wyświetlić wszystkie typy wyliczeń elementów.
SELECT * FROM pg_enum;
Następnie sprawdź, czy wyszukana wartość jest unikalna. Aby zwiększyć wyjątkowość podczas usuwania rekoru, oprócz słowa „enumlabel” należy przekazać „enumtypid”.
To polecenie usuwa wpis w typie wyliczenia, gdzie „unikalny” jest wartością.
DELETE FROM pg_enum pl WHERE pl.enumtypid = 124 AND en.enumlabel = 'unique';
UWAGA Opisany przeze mnie przykład musi być użyty, gdy przez przypadek dodamy nową wartość do typu wyliczenia, a jeszcze nie używaliśmy jej nigdzie w bazie danych.
źródło
ERROR: invalid internal value for enum
i NIE da żadnych wyników.)DELETE FROM pg_enum en WHERE en.enumtypid=124 AND en.enumlabel='unigue';
UWAGA powinna być wytłuszczona, a nie polecenie. Jeśli użyłeś wartości w jakiejś tabeli, nie możesz jej odzyskać. Nie można aktualizować wierszy zawierających wartość, nie można konwertować. Jedynym sposobem jest usunięcie całego wiersza.Dla tych, którzy chcą zmodyfikować wartości wyliczenia, odtworzenie tego wydaje się być jedynym realnym i bezpiecznym rozwiązaniem.
Polega ona na tymczasowej konwersji kolumny wyliczenia do formatu ciągu, odtworzeniu wyliczenia, a następnie ponownej konwersji kolumny ciągu z powrotem do typu wyliczenia.
Oto przykład:
źródło
ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_enum_name::your_schema.your_column;
powinno byćALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_schema.your_column::your_enum_name;
Użyj następującego zapytania, aby usunąć wartość ENUM z typu Postgresql
Tylko informacje o typie i wartości
Należy zmienić istniejące wartości na inne. W tym celu, jeśli chcesz dodać nową wartość, użyj:
Przed usunięciem zaktualizuj wartość typu do nowej wartości typu lub istniejącej wartości.
źródło
SELECT oid FROM pg_type WHERE typname = 'enum_type'
Programowy sposób na to jest następujący. Te same ogólne kroki, które podano w https://stackoverflow.com/a/47305844/629272, są odpowiednie, ale są one bardziej ręczne niż sensowne dla moich celów (pisanie alembicznej migracji w dół).
my_type
,my_type_old
ivalue_to_delete
oczywiście należy je odpowiednio zmienić.Zmień nazwę swojego typu.
Utwórz nowy typ z wartościami ze starego typu, z wyłączeniem tego, który chcesz usunąć.
Zmień wszystkie istniejące kolumny, które używają starego typu, aby używały nowego.
Usuń stary typ.
źródło
jeśli twój zbiór danych nie jest tak duży, możesz zrzucić
--column-inserts
, edytując zrzut za pomocą edytora tekstu, usuń wartość i ponownie zaimportuj zrzutźródło
Miałem ten sam problem w wersji 10. postgres. Usunięcie wymaga pewnych procedur, a jeśli sekwencja nie jest poprawna, istnieje nawet szansa, że tabela zostanie zablokowana do odczytu.
Napisałem wygodny skrypt do usunięcia. Już kilkakrotnie udowodniono swoją wydajność. Jednak ta procedura wymaga zastąpienia usuniętej wartości nową (może mieć wartość NULL, jeśli pozwala na to pole tabeli).
Aby skorzystać, wystarczy wypełnić 3 wartości.
źródło
Nie można usunąć pojedynczej wartości z ENUM, jedynym możliwym rozwiązaniem jest DROP i odtworzenie ENUM z potrzebnymi wartościami.
źródło
DELETE FROM pg_enum WHERE enumlabel='saml' AND enumsortorder=4;