PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eliminare un valore di tipo enum in postgres?

Cancelli (elimina) i tipi enum come qualsiasi altro tipo, con DROP TYPE :

DROP TYPE admin_level1;

È possibile che tu stia effettivamente chiedendo come rimuovere un singolo valore da un tipo enum ? Se è così, non puoi. Non è supportato:

Sebbene enum i tipi sono destinati principalmente a insiemi di valori statici, è disponibile il supporto per l'aggiunta di nuovi valori a un tipo enum esistente e per rinominare i valori (vedi ALTER TYPE ). I valori esistenti non possono essere rimossi da un tipo enum, né l'ordinamento di tali valori può essere modificato, a meno di eliminare e ricreare il tipo enum.

Devi creare un nuovo tipo senza il valore, convertire tutti gli usi esistenti del vecchio tipo per utilizzare il nuovo tipo, quindi eliminare il vecchio tipo.

Es.

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;