重命名PostgreSQL中的枚举项

时间:2012-09-27 18:26:18

标签: postgresql postgresql-9.1

我想在PostgreSQL 9.1.5中更改枚举类型中项目的名称。

这是类型的创建stmt:

CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');

我只想将'Task created'更改为'Aborted'。似乎来自documentation,以下内容应该有效:

ALTER TYPE import_action
RENAME ATTRIBUTE "Task created" TO "Aborted"; 

然而,我得到一个消息:

********** Error **********

ERROR: relation "import_action" does not exist
SQL state: 42P01

但是,它确实存在。

该类型目前正由多个表使用。

我认为一定没有办法做到这一点。我已经尝试了pgAdminIII中类型的对话框,但我无法看到它在那里重命名。 (所以,要么强烈暗示我不能这样做,要么 - 我希望 - 创建该对话框的开发人员会有一个小小的疏忽)

如果我不能在一个声明中这样做?那我该怎么办?我是否必须编写脚本来添加项目,将所有记录更新为新值,然后删除旧项目?这甚至会起作用吗?

看起来这应该是一件简单的事情。据我了解,记录只是存储对类型和项目的引用。我认为它们实际上并不存储我给它的文本值。但是,也许我在这里也错了。

4 个答案:

答案 0 :(得分:33)

在PostgreSQL版本10中,能够重命名枚举has been added的标签,作为ALTER TYPE语法的一部分:

ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value

答案 1 :(得分:31)

枚举值的名称称为标签,属性完全不同。

不幸的是,更改枚举标签并不简单,您必须清除系统目录: http://www.postgresql.org/docs/9.1/static/catalog-pg-enum.html

UPDATE pg_enum SET enumlabel = 'Aborted' 
WHERE enumlabel = 'Task created' AND enumtypid = (
  SELECT oid FROM pg_type WHERE typname = 'import_action'
)

答案 2 :(得分:11)

接受的答案中的查询未考虑架构名称。基于http://tech.valgog.com/2010/08/alter-enum-in-postgresql.html

,这是一个更安全(更简单)的方法
UPDATE pg_catalog.pg_enum
SET enumlabel = 'NEW_LABEL'
WHERE enumtypid = 'SCHEMA_NAME.ENUM_NAME'::regtype::oid AND enumlabel = 'OLD_LABEL'
RETURNING enumlabel;

请注意,这需要“rolcatupdate”(直接更新目录)权限 - 即使是超级用户也是不够的。

似乎直接更新目录仍然是PostgreSQL 9.3的唯一方法。

答案 3 :(得分:6)

类型,属性和值之间存在差异。您可以创建这样的枚举。

CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');

完成 之后,您可以将添加到枚举中。

ALTER TYPE import_action 
ADD VALUE 'Aborted';

但语法图未显示任何支持删除或重命名。您正在查看的语法是重命名属性的语法,而不是值。

虽然这种设计可能令人惊讶,但它也是刻意的。来自pgsql-hackers mailing list

  

如果需要修改使用的值或想知道整数是什么   是,改为使用查找表。枚举是错误的抽象   你。