web-dev-qa-db-ja.com

インデックスを削除せずに主キーを削除する

インデックスを削除せずにテーブルの主キー制約を削除することは可能ですか? PRIMARY KEY制約を削除して別の列ペアに設定するためにNOT NULLを削除したい場合があります。インデックスの削除と再作成を避けたいです。インデックスのPRIMARY KEY '属性'のみを削除できますか?制約を削除すると、インデックスが削除されます。

PostgreSQLバージョン9.1を使用しています。

5
xchg

これを行うためのサポートされている方法はないと思います。これまでのコメントを検討してください。

同時トランザクションへの影響が心配な場合は、 マニュアルのコード例 を参照してください。

インデックスの再構築中に更新をブロックせずに主キー制約を再作成するには:

CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
    ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;

あなたのケースでは、PKが2回目に使用するのと同じインデックスを新しいPKで使用されるインデックスを作成できます。次に、例のようにPKをドロップし、新しいインデックスと新しいUNIQUEに基づいて(例とは異なり)differentPKを追加します複製された以前のPKインデックスに基づく制約。 1つのステートメントですべて。それはミリ秒の間だけテーブルをロックします。
3つの個別のコマンド(1つのトランザクションではない):

CREATE UNIQUE INDEX CONCURRENTLY dupe_of_old_pk_idx ON tbl (old_pk_id);
CREATE UNIQUE INDEX CONCURRENTLY new_pk_idx ON tbl (new_pk_id1, new_pk_id2);

ALTER TABLE tbl
   DROP CONSTRAINT tbl_pkey
 , ADD  CONSTRAINT tbl_uni  UNIQUE USING INDEX dupe_of_old_pk_idx
 , ADD  CONSTRAINT tbl_pkey PRIMARY KEY USING INDEX new_pk_temp_idx;
4