如何删除在postgresql中创建的枚举类型值?
create type admin_level1 as enum('classifier', 'moderator', 'god');
我想把moderator
从列表中删除。
我似乎在文件上找不到任何东西。
我使用Postgresql 9.3.4。
发布于 2014-09-12 16:07:11
与任何其他类型一样,使用DROP TYPE
删除(删除)枚举类型
DROP TYPE admin_level1;
您是否真的在问如何从枚举类型中删除单个值?如果是这样的话,你就不能。它不受支持
虽然
enum
类型主要用于静态值集,但仍然支持向现有枚举类型添加新值和重命名值(请参阅ALTER TYPE
)。不能从枚举类型中删除现有值,也不能更改这些值的排序,除非删除和重新创建枚举类型。
必须在没有值的情况下创建新类型,将旧类型的所有现有用途转换为使用新类型,然后删除旧类型。
例如。
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;
发布于 2017-11-15 11:10:16
这里写得很好:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
重命名现有类型的
ALTER TYPE status_enum RENAME TO status_enum_old;
创建新类型的
CREATE TYPE status_enum AS ENUM('queued', 'running', 'done');
更新列以使用新类型的
ALTER TABLE job ALTER COLUMN job_status TYPE status_enum USING job_status::text::status_enum;
删除旧类型的
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之前被删除,然后再重新创建。有一些方法可以自动做到这一点。发布于 2015-09-03 11:29:48
如果要删除枚举类型的项,则必须对PostgreSQL的系统表进行操作。
使用此命令,您可以显示所有items枚举类型。
从pg_enum;中选择*
然后检查搜索的值是否唯一。要增加删除rekoru时的唯一性,除“enumlabel”外,还必须传递“enumtypid”。
此命令移除枚举类型中的条目,其中“唯一”是您的值。
从pg_enum en删除en.enumtypid=124和en.enumlabel='unique';
注意到我描述的示例必须使用,当我们偶然地向枚举类型添加新值时,但是在数据库中任何地方都没有使用它。
https://stackoverflow.com/questions/25811017
复制相似问题