如何删除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;