Wie lösche ich einen Aufzählungstypwert, den ich in postgresql erstellt habe?
create type admin_level1 as enum('classifier', 'moderator', 'god');
ZB möchte ich entfernen moderator
von der Liste .
Ich kann anscheinend nichts in den Dokumenten finden.
Ich verwende Postgresql 9.3.4.
postgresql
enums
Amjith
quelle
quelle
drop type admin_level1
?create xxx
gibt es eindrop xxx
Antworten:
Sie löschen (löschen) Aufzählungstypen wie jeden anderen Typ mit
DROP TYPE
:Ist es möglich, dass Sie tatsächlich fragen, wie Sie einen einzelnen Wert aus einem Aufzählungstyp entfernen können ? Wenn ja, können Sie nicht. Es wird nicht unterstützt :
Sie müssen einen neuen Typ ohne den Wert erstellen, alle vorhandenen Verwendungen des alten Typs in den neuen Typ konvertieren und dann den alten Typ löschen.
Z.B
quelle
(psycopg2.InternalError) ALTER TYPE ... ADD cannot run inside a transaction block
Sehr gut hier geschrieben:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
Benennen Sie den vorhandenen Typ um
Erstellen Sie den neuen Typ
Aktualisieren Sie die Spalten, um den neuen Typ zu verwenden
Entfernen Sie den alten Typ
quelle
Wenn Sie ein Element vom Typ Aufzählung löschen möchten, müssen Sie die Systemtabelle von PostgreSQL bearbeiten.
Mit diesem Befehl können Sie alle Aufzählungstypen anzeigen.
SELECT * FROM pg_enum;
Überprüfen Sie dann, ob der gesuchte Wert eindeutig ist. Um die Eindeutigkeit beim Entfernen von Rekoru zu erhöhen, muss zusätzlich zu 'enumlabel' 'enumtypid' übergeben werden.
Dieser Befehl entfernt den Eintrag im Aufzählungstyp, wobei 'unique' Ihr Wert ist.
DELETE FROM pg_enum de WHERE en.enumtypid = 124 AND en.enumlabel = 'unique';
HINWEIS Das von mir beschriebene Beispiel muss verwendet werden, wenn wir dem Aufzählungstyp zufällig einen neuen Wert hinzufügen und ihn dennoch nirgendwo in der Datenbank verwendet haben.
quelle
ERROR: invalid internal value for enum
und ergeben NO Ergebnisse.)DELETE FROM pg_enum en WHERE en.enumtypid=124 AND en.enumlabel='unigue';
sollte der HINWEIS fett gedruckt sein, nicht der Befehl. Wenn Sie den Wert in einer Tabelle verwendet haben, können Sie ihn nicht wiederherstellen. Sie können die Zeilen, die den Wert enthalten, nicht aktualisieren und nicht konvertieren. Die einzige Möglichkeit besteht darin, die gesamte Zeile zu löschen.Für diejenigen, die die Enum-Werte ändern möchten, scheint die Neuerstellung die einzig praktikable und sichere Lösung zu sein.
Es besteht darin, die Aufzählungsspalte vorübergehend in ein Zeichenfolgenformat zu konvertieren, die Aufzählung neu zu erstellen und die Zeichenfolgenspalte dann wieder in den Aufzählungstyp umzuwandeln.
Hier ist ein Beispiel:
quelle
ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_enum_name::your_schema.your_column;
sollte seinALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_schema.your_column::your_enum_name;
Verwenden Sie die folgende Abfrage, um den ENUM-Wert aus dem Postgresql-Typ zu löschen
Nur Infos für welchen Typ und welchen Wert
Sie sollten vorhandene Werte in andere ändern. Wenn Sie dafür einen neuen Wert hinzufügen müssen, verwenden Sie:
Aktualisieren Sie vor dem Löschen den Typwert auf einen neuen Typwert oder einen vorhandenen Wert.
quelle
SELECT oid FROM pg_type WHERE typname = 'enum_type'
Der programmatische Weg, dies zu tun, ist wie folgt. Die gleichen allgemeinen Schritte wie unter https://stackoverflow.com/a/47305844/629272 sind angemessen, aber diese sind für meine Zwecke eher manuell als sinnvoll (Schreiben einer Alembic-Down-Migration).
my_type
,,my_type_old
undvalue_to_delete
sollte natürlich entsprechend geändert werden.Benennen Sie Ihren Typ um.
Erstellen Sie einen neuen Typ mit den Werten Ihres alten Typs, mit Ausnahme desjenigen, den Sie löschen möchten.
Ändern Sie alle vorhandenen Spalten, die den alten Typ verwenden, um den neuen zu verwenden.
Löschen Sie den alten Typ.
quelle
Wenn Ihr Dataset nicht so groß ist, können Sie
--column-inserts
den Speicherauszug mit einem Texteditor bearbeiten, den Wert entfernen und den Speicherauszug erneut importierenquelle
Hatte das gleiche Problem in v.10. postgres. Das Löschen erfordert bestimmte Verfahren, und wenn die Reihenfolge nicht korrekt ist, besteht sogar die Möglichkeit, dass die Tabelle zum Lesen gesperrt wird.
Schrieb ein praktisches Skript zum Löschen. Bereits mehrfach seine Leistung bewiesen. Bei diesem Verfahren wird jedoch der gelöschte Wert durch einen neuen ersetzt (er kann NULL sein, wenn das Tabellenfeld dies zulässt).
Zur Verwendung müssen Sie nur 3 Werte eingeben.
quelle
Es ist nicht möglich, einzelne Werte aus ENUM zu löschen. Die einzig mögliche Lösung besteht darin, ENUM mit den erforderlichen Werten zu TROPFEN und neu zu erstellen.
quelle
DELETE FROM pg_enum WHERE enumlabel='saml' AND enumsortorder=4;