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

Hvordan sletter man en enum type værdi i postgres?

Du sletter (slip) enum-typer som enhver anden type med DROP TYPE :

DROP TYPE admin_level1;

Er det muligt, at du rent faktisk spørger om, hvordan du fjerner en individuel værdi fra en enum-type ? Hvis ja, kan du ikke. Det er ikke understøttet:

Selvom enum typer er primært beregnet til statiske værdisæt, der er understøttelse for at tilføje nye værdier til en eksisterende opregningstype og til at omdøbe værdier (se ALTER TYPE ). Eksisterende værdier kan ikke fjernes fra en enum-type, og sorteringsrækkefølgen af ​​sådanne værdier kan heller ikke ændres, undtagen at slette og genskabe enum-typen.

Du skal oprette en ny type uden værdien, konvertere alle eksisterende anvendelser af den gamle type til at bruge den nye type, og slip derefter den gamle type.

F.eks.

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. INDSÆT med ORDER på Oracle

  2. Brug af databaseskemaer i SQL Server

  3. Liste kolonner med indekser i PostgreSQL

  4. MySQL-forespørgsel - Registrerer mellem i dag og sidste 30 dage