说我有以下枚举:
CREATE TYPE "my_enum" AS ENUM('value1', 'value2', 'value3');
我想删除value3
。从我在文档和以前的线程中所看到的,我实际上必须删除整个枚举,并使用所需的值重新创建它。像这样:
DROP TYPE IF EXISTS "my_enum";
CREATE TYPE "my_enum" AS ENUM('value1', 'value2');
问题在于我还有其他依赖于该枚举的表,因此它不允许我这样做。我收到以下消息(完全正确):
错误:由于其他对象依赖它,因此无法删除类型“ my_enum”
所以我的问题是如何删除枚举值之一而不丢掉整个东西?我知道我只需更改即可轻松添加值:
ALTER TYPE "my_enum" ADD VALUE 'value4';
所以我认为删除时我可以做一些等效的事情。
谢谢!
答案 0 :(得分:1)
您必须删除类型,但是,您可以临时更改包含该类型列的表。
示例模型:
banana
从枚举类型中删除alter table my_table alter my_col type text;
drop type my_enum;
create type my_enum as enum('apple', 'pear');
alter table my_table alter my_col type my_enum using my_col::my_enum;
:
select * from my_table;
id | my_col
----+--------
1 | apple
2 | pear
(2 rows)
检查:
>>> '{v:,.0f}'.format(v=val/1000000)
121
答案 1 :(得分:1)
嗯,虽然实际上不建议这样做,但是如果您有权的话,有一种方法可以实现:
SELECT
t.typname,
e.enumlabel,
e.enumtypid
FROM pg_type t
JOIN pg_enum e ON e.enumtypid = t.oid
WHERE t.typname = '<your enum name>'
这将为您提供枚举类型的dbms内部ID enumtypid
。
通过此操作,您可以删除:
DELETE FROM pg_enum
WHERE enumtypid = <your enumtypid>
AND enumlabel = '<enum value to delete>'
您必须确保在此之前不再使用该值。否则您的表可能会损坏!