Created
October 26, 2012 10:07
-
-
Save d11wtq/3957966 to your computer and use it in GitHub Desktop.
Renaming an ENUM label in PostgreSQL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Assuming you have an enum type like this. | |
You want to rename 'pending' to 'lodged' | |
*/ | |
CREATE TYPE dispute_status AS ENUM('pending', 'resolved', 'open', 'cancelled'); | |
BEGIN; | |
ALTER TYPE dispute_status ADD VALUE 'lodged'; | |
UPDATE dispute SET status = 'lodged' WHERE status = 'pending'; | |
/* if it was a default value on the column, also do this */ | |
ALTER TABLE disputes ALTER COLUMN status SET DEFAULT 'lodged'; | |
/* Make a new temporary type with the enum you want */ | |
CREATE TYPE dispute_status_new AS ENUM('lodged', 'resolved', 'open', 'cancelled'); | |
/* Migrate to the new type, specifying the cast to a string */ | |
ALTER TABLE disputes ALTER COLUMN status SET DATA TYPE dispute_status_new USING status::text; | |
/* Switch the types over */ | |
DROP TYPE dispute_status; | |
ALTER TYPE dispute_status_new RENAME TO dispute_status; | |
COMMIT; |
In PostgreSQL 10, ALTER TABLE ... RENAME VALUE
could be used:
ALTER TYPE dispute_status RENAME VALUE 'pending' TO 'lodged';
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@a0s since
ALTER TYPE ... ADD
indeed cannot be run inside a transaction block, I've solved it in a different way, namely by changing the column data type temporarily toTEXT
, dropping the type, creating a new type and setting the data type back :)