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

以下是类型的create stmt:

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

我只想将"任务已创建"更改为"已中止".从documentation人看来,以下几点应该是有效的:

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

然而,我得到了一条消息:

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

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

但是,它显然确实存在.

该类型当前被多个表使用.

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

如果我不能一次完成这件事?那我该怎么办?我是否需要编写一个脚本来添加项目,将所有记录更新为新值,然后删除旧项目?这样行吗?

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

推荐答案

Update: For PostgreSQL version 10 or later, see the top-voted answer.

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

不幸的是,更改枚举标签并不简单,您必须修改系统目录:

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

Postgresql相关问答推荐

Trunc函数不删除小数

使用 pgx 扫描范围类型

如何在docker-compose中使用docker secrets设置ConnectionString?

如何使用 Grafana 测量 PostgreSQL 中的复制

如何在 spring/JPA 中记录表和列名以防数据库错误

Power BI + Postgres:只读用户

气流数据库如何定期管理?

如何在 sequelize 使用 db postgres 中通过外键更新记录和更新包含许多记录关系

如何使用 PostgreSQL 数据库中的函数和存储过程从动态表中获取所有数据?参数传入的表名

TimescaleDB 连续聚合:如何存储连续聚合结果

如何在 PostgreSQL 的回归测试中测试 TYPE 发送和接收函数

Postgres - 如何加入两列?

使用 Django + Postgres 的加密策略?

如何在 Postgres 中的列上删除唯一约束?

如何将 DELETE 的返回值插入到 postgresql 中的 INSERT 中?

SQL:当谈到 NOT IN 和 NOT EQUAL TO 时,哪个更有效,为什么?

为 Django Postgres 连接强制 SSL

PGAdmin 编辑数据

Entity Framework Core jsonb 列类型

PostgreSQL 9.1:如何连接数组中的行而不重复,加入另一个表