How to delete an enum type value in postgres?
You delete (drop) enum types like any other type, with DROP TYPE
:
DROP TYPE admin_level1;
Is it possible you're actually asking about how to remove an individual value from an enum type? If so, you can't. It's not supported:
Although
enum
types are primarily intended for static sets of values, there is support for adding new values to an existing enum type, and for renaming values (seeALTER TYPE
). Existing values cannot be removed from an enum type, nor can the sort ordering of such values be changed, short of dropping and re-creating the enum type.
You must create a new type without the value, convert all existing uses of the old type to use the new type, then drop the old type.
E.g.
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;
Very well written here:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
rename the existing type
ALTER TYPE status_enum RENAME TO status_enum_old;
create the new type
CREATE TYPE status_enum AS ENUM('queued', 'running', 'done');
update the columns to use the new type
ALTER TABLE job ALTER COLUMN job_status TYPE status_enum USING job_status::text::status_enum;
remove the old type
DROP TYPE status_enum_old;
Possible Errors and Troubleshooting:
-
invalid input value for enum {enum name}: "{some value}"
- One or more rows have a value ("{some value}"
) that is not in your new type. You must handle these rows before you can update the column type. -
default for column "{column_name}" cannot be cast automatically to type {enum_name}
- The default value for the column is not in your new type. You must change or remove the default value for the column before you can update the column type. Thanks to Philipp for this addition.