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コマンドに戻ります。
関連: