PostgreSQLで既存のインデックスを主キーに昇格させる方法


13

テーブル内で主キーを作成する方法は知っていますが、既存のインデックスを主キーにするにはどうすればよいですか?あるデータベースから別のデータベースに既存のテーブルをコピーしようとしています。テーブルを表示すると、下部のインデックスは次の形式になっています。

"my_index" PRIMARY KEY, btree (column1, column2)

私はインデックスを作成しました:

CREATE INDEX my_index ON my_table (column1, column2)

しかし、私はそれを主キーにする方法を知りません...

更新:サーバーのバージョンは8.3.3です


1
主キーの名前としてmy_indexが表示されている場合、すでにインデックスあります。Postgresには(一意の)インデックスのないPKはありません
a_horse_with_no_name

1
PostgreSQLのバージョンは何ですか?
filiprem

私は8.3.3を実行しているよ
WildBill

回答:


16

ALTER TABLEを使用して主キー制約を追加します。Postgresでは、「ALTER TABLE .. ADD table_constraint_using_index」フォームを使用してインデックスを「昇格」できます

もちろん、インデックスは主キーに対して一意である必要があります

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;

私にはうまくいきませんでした。PK_my_tableとは何ですか?これがラベルであると仮定し、テーブルの名前に「PK_」を追加しますか?「文字83で『USING:私は』またはその近く構文エラーERROR」と言って、構文エラーを得た
WildBill

1
@ngramsky: USING INDEX9.1以降で利用可能です。私はあなたが現在のバージョンで実行されていないと思うので
a_horse_with_no_name

いいえ、8.3.3を使用していますが、8.3.3ではどのように実行しますか?
WildBill

5
その古いバージョンでそれを行う唯一の方法は、インデックスを削除し、新しいpk制約を追加することです。
a_horse_with_no_name

2
@a_horse_with_no_name:あなたはその答えをする必要があります:あなたのコメントは、他の答えを以前から...
GBN

7

そのバージョンのpostgresqlでは、インデックスを主キーに変換することは不可能だと思います。

既存のインデックスを削除し、指定した列を使用して主キーを作成します。

DROP INDEX my_index;
ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);

7.4および8.4で動作


btw、「テーブル名の前にONLYが指定されている場合、そのテーブルのみが変更されます。ONLYが指定されていない場合、テーブルとそのすべての子テーブル(存在する場合)が変更されます。」
パオロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.