首页 > 解决方案 > 如何更改枚举选项?

问题描述

我在 Postgres 中定义了一个新类型:

CREATE TYPE PROJECT_STATUS AS ENUM ('draft', 'accepting_members', 'ongoing', 'completed');

现在,我想更改accepting_members要调用的ongoing_accepting

如果我正确理解 Postgres,那ALTER TYPE应该对我有所帮助。我试过这个:

mypostgresproject=# SELECT version();
                                                     version
------------------------------------------------------------------------------------------------------------------
 PostgreSQL 12.0 (Debian 12.0-2.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
(1 row)

mypostgresproject=# \dT
          List of data types
 Schema |      Name      | Description
--------+----------------+-------------
 public | project_status |
(1 row)

mypostgresproject=# SELECT
    pg_type.typname,
     pg_enum.enumlabel
FROM
    pg_type
JOIN
    pg_enum ON pg_enum.enumtypid = pg_type.oid;
    typname     |     enumlabel
----------------+-------------------
 project_status | draft
 project_status | accepting_members
 project_status | ongoing
 project_status | stopped
(4 rows)

mypostgresproject=# ALTER TYPE project_status RENAME ATTRIBUTE accepting_members TO ongoing_accepting CASCADE;
ERROR:  relation "project_status" does not exist
mypostgresproject=#

我应该怎么做?

标签: postgresql

解决方案


医生说_

RENAME ATTRIBUTE
此表单仅适用于复合类型。它更改类型的单个属性的名称。

重命名值
此表单重命名枚举类型的值。该值在枚举排序中的位置不受影响。如果指定的值不存在或新名称已存在,则会发生错误。

因此,由于您正在处理枚举,因此必须使用rename value,并且由于该值是字符串,因此必须用引号引起来:

ALTER TYPE project_status RENAME VALUE 'accepting_members' TO 'ongoing_accepting';

推荐阅读