首页 文章

重命名PostgreSQL中的枚举项

提问于
浏览
31

我想在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 回答

  • 5

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

    不幸的是,更改枚举标签并不简单,您必须清除系统目录: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'
    )
    
  • 30

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

    ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
    
  • 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的唯一方法 .

  • 17

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

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

    完成后,您可以向枚举添加值 .

    ALTER TYPE import_action 
    ADD VALUE 'Aborted';
    

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

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

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

相关问题