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

テーブルIDをシリアルからIDに変更するにはどうすればよいですか?

    BEGIN;
    ALTER TABLE public.client ALTER clientid DROP DEFAULT; -- drop default
    
    DROP SEQUENCE public.client_clientid_seq;              -- drop owned sequence
    
    ALTER TABLE public.client
    -- ALTER clientid SET DATA TYPE int,                   -- not needed: already int
       ALTER clientid ADD GENERATED ALWAYS AS IDENTITY (RESTART 108);
    COMMIT;
    

    2つの変数があります:

    • 添付されたSEQUENCEの実際の名前 。上記のデフォルト名を使用しましたが、名前が異なる場合があります。
    • client.clientidの現在の最大値 。現在107行あるという理由だけで、107である必要はありません。

    このクエリは両方を取得します:

    SELECT pg_get_serial_sequence('client', 'clientid'), max(clientid) FROM client;
    

    serial 列はintegerです 所有する列 専用シーケンスであり、そこから描画するようにデフォルトが設定されています(投稿したテーブル定義からわかるように)。プレーンなintegerにするため 、デフォルトを削除してから、シーケンスを削除します。

    列をIDENTITYに変換する 独自のシーケンスを追加します。あなたはしなければならない 古い所有シーケンス(または少なくともシーケンスを削除すると消滅する所有権)を削除します。それ以外の場合は、次のようなエラーが発生します:

    テーブルの構造と内容をコピーする方法はありますが、シーケンスは異なりますか?

    次に、プレーンなintegerを変換します IDENTITYへの列 列をクリックし、現在の最大値 plus 1で再起動します。 。あなたはしなければならない 一意の違反を回避するために、新しい内部シーケンスの現在の値を設定します。

    すべてを1つのトランザクションでラップするため、移行の途中で混乱することはありません。これらのDDLコマンドはすべてPostgresでトランザクションであり、コミットされるまでロールバックでき、それ以降に開始される他のトランザクションにのみ表示されます。

    あなたのコラムは以前はPKでしたが、PKのままです。これは変化と直交しています。

    (Postgres 10の新機能)IDENTITYの主な著者であるPeterEisentraut この機能は、関数upgrade_serial_to_identity()も提供します 既存のserialを変換します 列。既存のシーケンスを再利用し、代わりにシステムカタログを直接更新します。これは、自分が何をしているかを正確に理解していない限り、自分で行うべきではありません。また、エキゾチックなコーナーケースについても説明します。チェックしてください(「アップグレード」の章):

    ただし、この機能は、システムカタログの直接操作を許可しないほとんどのホストされたサービスでは機能しません。次に、上部の指示に従ってDDLコマンドに戻ります。

    関連:



    1. postgresデータベースに単一のテーブルのバックアップを作成するにはどうすればよいですか?

    2. ロックされた行を待たないようにするためのアドバイザリロックまたはNOWAIT?

    3. SQLServerでのORDERBY... COLLATE

    4. mysql_fetch_array()を呼び出すときに、提供された引数を取得することは、有効なMySQL結果リソースではありません