Postgres 11を使用していて、大きなテーブル(約7億5000万行)の主キーをサポートするインデックスを変更したいと考えています。主キーはbigint
列id
であり、INCLUDE
用語を使用して追加の列を含めたいと思います。これは、テーブルの書き換えなしで発生する必要があります(つまり、新しい列や変更された列はありません)。
現在のPRIMARY KEY
制約を削除することは、他の多くのテーブルがターゲットテーブルを参照するため、不便です。これらすべてのテーブルのFOREIGN KEY
制約を削除してから、PRIMARY KEY
制約を削除し、新しいインデックスを使用して再作成してから、FOREIGN KEY
制約を再作成することができると思います。それを行うより良い方法はありますか?
カタログをいじらないで(これは称賛に値しません)、私が考えることができる唯一のオプションは、しばらくの間外部キーなしで行うことを要求するでしょう:
適切なUNIQUE
句を含むテーブルに2番目のINCLUDE
インデックスを定義できます。
CREATE INDEX
のCONCURRENTLY
句を使用する場合、混乱を招くことはありません。
次に、DROP INDEX ... CASCADE
を使用して、元の主キー制約とすべての依存する外部キーを削除できます。
次に、ALTER TABLE ... ADD CONSTRAINT ... USING INDEX
を使用して、一意のインデックスを主キー制約に変換します。
これで、外部キー制約を再作成できます。