在postgres中删除单个枚举值

时间:2019-06-26 15:57:15

标签: postgresql enums postgresql-9.5

说我有以下枚举:

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';

所以我认为删除时我可以做一些等效的事情。

谢谢!

2 个答案:

答案 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>'

您必须确保在此之前不再使用该值。否则您的表可能会损坏!