sql >> Databáze >  >> RDS >> PostgreSQL

Jak odstranit hodnotu typu enum v postgresu?

Typy výčtu smažete (vypustíte) jako jakýkoli jiný typ pomocí DROP TYPE :

DROP TYPE admin_level1;

Je možné, že se vlastně ptáte na to, jak odstranit jednotlivou hodnotu z typu enum ? Pokud ano, nemůžete. Není podporováno:

Ačkoli enum typy jsou primárně určeny pro statické sady hodnot, existuje podpora pro přidávání nových hodnot do existujícího typu výčtu a pro přejmenování hodnot (viz ALTER TYPE ). Existující hodnoty nelze z typu výčtu odstranit ani nelze změnit řazení těchto hodnot, kromě vypuštění a opětovného vytvoření výčtového typu.

Musíte vytvořit nový typ bez hodnoty, převést všechna existující použití starého typu na nový typ a poté starý typ vypustit.

Např.

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;


  1. Zálohovat pouze schéma SQL?

  2. Problémy při používání Microsoft Access Runtime

  3. Jak nastavit časovač pro volání funkce každých n minut?

  4. Omezení vráceného záznamu z SQL dotazu v Oracle