首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除postgres中的枚举类型值?

如何删除postgres中的枚举类型值?
EN

Stack Overflow用户
提问于 2014-09-12 14:48:12
回答 10查看 140.1K关注 0票数 185

如何删除在postgresql中创建的枚举类型值?

代码语言:javascript
运行
复制
create type admin_level1 as enum('classifier', 'moderator', 'god');

我想把moderator从列表中删除。

我似乎在文件上找不到任何东西。

我使用Postgresql 9.3.4。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2014-09-12 16:07:11

与任何其他类型一样,使用DROP TYPE删除(删除)枚举类型

代码语言:javascript
运行
复制
DROP TYPE admin_level1;

您是否真的在问如何从枚举类型中删除单个值?如果是这样的话,你就不能。它不受支持

虽然enum类型主要用于静态值集,但仍然支持向现有枚举类型添加新值和重命名值(请参阅ALTER TYPE)。不能从枚举类型中删除现有值,也不能更改这些值的排序,除非删除和重新创建枚举类型。

必须在没有值的情况下创建新类型,将旧类型的所有现有用途转换为使用新类型,然后删除旧类型。

例如。

代码语言:javascript
运行
复制
CREATE TYPE admin_level1 AS ENUM ('classifier', 'moderator');

CREATE TABLE blah (
    user_id integer primary key,
    power admin_level1 not null
);

INSERT INTO blah(user_id, power) VALUES (1, 'moderator'), (10, 'classifier');

ALTER TYPE admin_level1 ADD VALUE 'god';

INSERT INTO blah(user_id, power) VALUES (42, 'god');

-- .... oops, maybe that was a bad idea

CREATE TYPE admin_level1_new AS ENUM ('classifier', 'moderator');

-- Remove values that won't be compatible with new definition
-- You don't have to delete, you might update instead
DELETE FROM blah WHERE power = 'god';

-- Convert to new type, casting via text representation
ALTER TABLE blah 
  ALTER COLUMN power TYPE admin_level1_new 
    USING (power::text::admin_level1_new);

-- and swap the types
DROP TYPE admin_level1;

ALTER TYPE admin_level1_new RENAME TO admin_level1;
票数 270
EN

Stack Overflow用户

发布于 2017-11-15 11:10:16

这里写得很好:

http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/

重命名现有类型的

代码语言:javascript
运行
复制
ALTER TYPE status_enum RENAME TO status_enum_old;

创建新类型的

代码语言:javascript
运行
复制
CREATE TYPE status_enum AS ENUM('queued', 'running', 'done');

更新列以使用新类型的

代码语言:javascript
运行
复制
ALTER TABLE job ALTER COLUMN job_status TYPE status_enum USING job_status::text::status_enum;

删除旧类型的

代码语言:javascript
运行
复制
DROP TYPE status_enum_old;

可能出现的错误和故障排除:

  • invalid input value for enum {enum name}: "{some value}" -一个或多个行的值("{some value}")不在您的新类型中。在更新列类型之前,必须处理这些行。
  • default for column "{column_name}" cannot be cast automatically to type {enum_name} -列的默认值不在新类型中。在更新列类型之前,必须更改或删除列的默认值。感谢飞利浦的这一增加。
  • cannot alter type of a column used by a view or rule -使用该列的所有视图和规则都必须在执行ALTER之前被删除,然后再重新创建。有一些方法可以自动做到这一点。
票数 114
EN

Stack Overflow用户

发布于 2015-09-03 11:29:48

如果要删除枚举类型的项,则必须对PostgreSQL的系统表进行操作。

使用此命令,您可以显示所有items枚举类型。

从pg_enum;中选择*

然后检查搜索的值是否唯一。要增加删除rekoru时的唯一性,除“enumlabel”外,还必须传递“enumtypid”。

此命令移除枚举类型中的条目,其中“唯一”是您的值。

从pg_enum en删除en.enumtypid=124和en.enumlabel='unique';

注意到我描述的示例必须使用,当我们偶然地向枚举类型添加新值时,但是在数据库中任何地方都没有使用它。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25811017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档