インデックスを削除せずにテーブルの主キー制約を削除することは可能ですか? PRIMARY KEY
制約を削除して別の列ペアに設定するためにNOT NULL
を削除したい場合があります。インデックスの削除と再作成を避けたいです。インデックスのPRIMARY KEY
'属性'のみを削除できますか?制約を削除すると、インデックスが削除されます。
PostgreSQLバージョン9.1を使用しています。
これを行うためのサポートされている方法はないと思います。これまでのコメントを検討してください。
同時トランザクションへの影響が心配な場合は、 マニュアルのコード例 を参照してください。
インデックスの再構築中に更新をブロックせずに主キー制約を再作成するには:
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;