如何删除postgres中的枚举types值?

如何删除我在postgresql中创build的枚举types值?

create type admin_level1 as enum('classifier', 'moderator', 'god'); 

例如,我想从列表中删除moderator

我似乎无法find文档上的任何内容。

我正在使用Postgresql 9.3.4。

您可以像删除任何其他types一样删除(删除)枚举types,使用DROP TYPE

 DROP TYPE admin_level1; 

是否有可能实际上问如何从一个枚举types中删除一个单独的值 ? 如果是这样,你不能。 它不受支持。 您必须创build一个没有值的新types,将旧types的所有现有用途转换为使用新types,然后删除旧types。

例如

 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; 

如果你想删除枚举types的项目,你必须在PostgreSQL的系统表上进行操作。

使用此命令,可以显示所有项目的枚举types。

SELECT * FROM pg_enum;

然后检查search的值是否唯一。 除了“enumlabel”,除去rekoru期间增加独特性必须通过'enumtypid'。

该命令删除枚举types中的条目,其中“唯一”是您的值。

DELETE FROM pg_enum en WHERE en.enumtypid = 124 AND en.enumlabel ='unique';

注意我们所描述的例子必须被使用,偶然的时候我们给枚举types增加新的值,但是我们还没有在数据库的任何地方使用它。

对于那些希望修改枚举值的人来说,重新创build它似乎是唯一可行且安全的解决scheme。

它包括暂时将枚举列转换为string格式,重新创build枚举,然后将string列转换回枚举types。

这里是一个例子:

 ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE varchar(255); ALTER TABLE your_schema.your_table ALTER COLUMN your_column SET DEFAULT('your_default_enum_value'); DROP TYPE your_schema.your_enum_name; CREATE TYPE your_schema.your_enum_name AS ENUM ('enum1', 'enum2', 'enum3'); ALTER TABLE your_schema.your_table ALTER your_column DROP DEFAULT; ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_enum_name::your_schema.your_column; ALTER TABLE your_schema.your_table ALTER COLUMN your_column SET DEFAULT('your_default_enum_value'); 

如果你的数据集不是那么大,你可以使用--column-inserts来转储,用文本编辑器编辑转储,删除值并重新导入转储

使用以下查询从Postgresqltypes中删除ENUM值

 DELETE FROM pg_enum WHERE enumlabel = 'moderator' AND enumtypid = ( SELECT oid FROM pg_type WHERE typname = 'admin_level1'); 

只要知道什么是types和什么是价值

 DELETE FROM pg_enum WHERE enumlabel = 'ENUM_VALUE' AND enumtypid = ( SELECT oid FROM pg_type WHERE typname = 'ENUM_TYPE') 

您应该将现有值更改为其他值。 为此,如果您需要添加新的值,然后使用:

 ALTER TYPE **ENUM_TYPE** ADD VALUE '**ENUM_VALUE2**'; 

在删除之前,将types值更新为新types值或现有值。

很好写在这里:

http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/

重命名现有的types

ALTER TYPE status_enum RENAME TO status_enum_old;

创build新的types

CREATE TYPE status_enum AS ENUM('queued','running','done');

更新列以使用新的types

ALTER TABLE作业ALTER COLUMN job_status TYPE status_enum使用job_status :: text :: status_enum;

删除旧的types

DROP TYPE status_enum_old;