1. ホーム
  2. postgresql

[解決済み] postgresでenum型の値を削除する方法は?

2022-04-29 17:22:06

質問

postgresqlで作成したenum型の値を削除するにはどうすればよいですか?

create type admin_level1 as enum('classifier', 'moderator', 'god');

moderator をリストから削除します。

ドキュメントには何も書かれていないようですが。

Postgresql 9.3.4を使っています。

解決方法を教えてください。

他の型と同じように、enum 型を削除(ドロップ)するには 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;