PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie lösche ich einen Enum-Typ-Wert in Postgres?

Aufzählungstypen löschen (droppen) Sie wie jeden anderen Typ mit DROP TYPE :

DROP TYPE admin_level1;

Ist es möglich, dass Sie tatsächlich fragen, wie man einen einzelnen Wert aus einem Aufzählungstyp entfernt ? Wenn ja, können Sie nicht. Es wird nicht unterstützt:

Obwohl enum -Typen sind in erster Linie für statische Sätze von Werten gedacht, es gibt Unterstützung für das Hinzufügen neuer Werte zu einem vorhandenen Aufzählungstyp und für das Umbenennen von Werten (siehe ALTER TYPE ). Vorhandene Werte können nicht aus einem Aufzählungstyp entfernt werden, noch kann die Sortierreihenfolge solcher Werte geändert werden, es sei denn, der Aufzählungstyp wird gelöscht und neu erstellt.

Sie müssen einen neuen Typ ohne den Wert erstellen, alle vorhandenen Verwendungen des alten Typs konvertieren, um den neuen Typ zu verwenden, und dann den alten Typ löschen.

Z. B.

CREATE TYPE admin_level1 AS ENUM ('classifier', 'moderator');

CREATE TABLE blah (
    user_id integer primary key,
    power admin_level1 not null
);

INSERT INTO blah(user_id, power) VALUES (1, 'moderator'), (10, 'classifier');

ALTER TYPE admin_level1 ADD VALUE 'god';

INSERT INTO blah(user_id, power) VALUES (42, 'god');

-- .... oops, maybe that was a bad idea

CREATE TYPE admin_level1_new AS ENUM ('classifier', 'moderator');

-- Remove values that won't be compatible with new definition
-- You don't have to delete, you might update instead
DELETE FROM blah WHERE power = 'god';

-- Convert to new type, casting via text representation
ALTER TABLE blah 
  ALTER COLUMN power TYPE admin_level1_new 
    USING (power::text::admin_level1_new);

-- and swap the types
DROP TYPE admin_level1;

ALTER TYPE admin_level1_new RENAME TO admin_level1;