sql >> データベース >  >> RDS >> PostgreSQL

postgresで列挙型の値を削除するにはどうすればよいですか?

    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;
    


    1. MariaDBにテーブルが存在するかどうかを確認する4つの方法

    2. オブジェクトタイプのネストされたテーブルを使用してOracleテーブルを作成するにはどうすればよいですか?

    3. --skip-grant-tablesでMySQLを起動する方法は?

    4. DBMS_METADATA(およびSCHEMA_EXPORT)を使用してOracleSCHEMAをDDLスクリプトとして取得するにはどうすればよいですか。