PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment supprimer une valeur de type enum dans postgres ?

Vous supprimez (supprimez) les types d'énumération comme n'importe quel autre type, avec DROP TYPE :

DROP TYPE admin_level1;

Est-il possible que vous demandiez réellement comment supprimer une valeur individuelle d'un type enum ? Si c'est le cas, vous ne pouvez pas. Il n'est pas pris en charge :

Bien que enum les types sont principalement destinés aux ensembles de valeurs statiques, il existe un support pour ajouter de nouvelles valeurs à un type enum existant et pour renommer les valeurs (voir ALTER TYPE ). Les valeurs existantes ne peuvent pas être supprimées d'un type enum, et l'ordre de tri de ces valeurs ne peut pas non plus être modifié, à moins de supprimer et de recréer le type enum.

Vous devez créer un nouveau type sans la valeur, convertir toutes les utilisations existantes de l'ancien type pour utiliser le nouveau type, puis supprimer l'ancien type.

Par exemple

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;