重命名PostgreSQL中的枚举项

Dav*_*d S 36 postgresql postgresql-9.1

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

这是类型的创建stmt:

CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');
Run Code Online (Sandbox Code Playgroud)

我只想将'Task created'改为'Aborted'.从文档中可以看出,以下内容应该有效:

ALTER TYPE import_action
RENAME ATTRIBUTE "Task created" TO "Aborted"; 
Run Code Online (Sandbox Code Playgroud)

但是,我得到一个消息:

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

ERROR: relation "import_action" does not exist
SQL state: 42P01
Run Code Online (Sandbox Code Playgroud)

但是,它显然确实存在.

该类型当前正由多个表使用.

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

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

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

cst*_*roe 41

在PostgreSQL版本10中,重命名枚举标签的功能已添加ALTER TYPE语法的一部分:

ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记引用值 ```alter type order_status rename value 'new' to 'draft'``` (2认同)

Don*_*oma 32

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

不幸的是,更改枚举标签并不简单,您必须使用系统目录: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'
)
Run Code Online (Sandbox Code Playgroud)


EM0*_*EM0 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;
Run Code Online (Sandbox Code Playgroud)

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

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


Mik*_*ll' 6

类型,属性和值之间存在差异.你可以像这样创建一个枚举.

CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');
Run Code Online (Sandbox Code Playgroud)

做完,你可以添加的枚举.

ALTER TYPE import_action 
ADD VALUE 'Aborted';
Run Code Online (Sandbox Code Playgroud)

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

虽然这种设计可能令人惊讶,但它也是刻意的.来自pgsql-hackers邮件列表.

如果您需要修改使用的值或想知道整数是什么,请改用查找表.枚举对你来说是错误的抽象.

  • 实际上,邮件列表中的引用有点脱节.它指的是想要访问枚举整数表示的用户.至于更改标签,邮件列表条目说:"支持ALTER TYPE以允许添加/修改值等.暂时你只需要创建一个新类型,做一堆ALTER TABLE命令,DROP旧如果你想要旧的名字,请输入并重新命名." (2认同)