sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur tar man bort ett enumtypvärde i postgres?

Du tar bort (släpp) enumtyper som vilken annan typ som helst, med DROP TYPE :

DROP TYPE admin_level1;

Är det möjligt att du faktiskt frågar om hur man tar bort ett individuellt värde från en uppräkningstyp ? I så fall kan du inte. Det stöds inte:

Även om enum typer är främst avsedda för statiska uppsättningar av värden, det finns stöd för att lägga till nya värden till en befintlig enumtyp och för att byta namn på värden (se ALTER TYPE ). Befintliga värden kan inte tas bort från en uppräkningstyp, inte heller kan sorteringsordningen för sådana värden ändras, utan att ta bort och återskapa uppräkningstypen.

Du måste skapa en ny typ utan värdet, konvertera alla befintliga användningar av den gamla typen till att använda den nya typen och släpp sedan den gamla typen.

T.ex.

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. MySQL Insert-frågan fungerar inte med WHERE-satsen

  2. Anslut till fjärrpostgresql-server på amazon ec2

  3. Android SQLite stängt undantag

  4. Använder datum i en kontrollbegränsning, Oracle