web-dev-qa-db-ja.com

Postgresql 9.3:既存の一意のインデックスを使用して一意の制約を追加する

実稼働データベースの1つで、DBフィールドに一意の制約を追加したいと思います。残念ながら、次のステートメントはブロックしています。

ALTER TABLE package ADD CONSTRAINT unique_package_id UNIQUE (package_id);

PostgreSQLマニュアルの関連部分 を読む:

注:既存のインデックスを使用して制約を追加すると、テーブルの更新を長時間ブロックせずに新しい制約を追加する必要がある場合に役立ちます。これを行うには、CREATE INDEX CONCURRENTLYを使用してインデックスを作成し、この構文を使用して公式の制約としてインストールします。以下の例を参照してください。

私は試した:

CREATE UNIQUE INDEX CONCURRENTLY package_tmp_id_idx ON answer (package_id);

に続く:

prod_db=> ALTER TABLE package ADD CONSTRAINT 
          unique_package_id UNIQUE (package) USING INDEX package_tmp_id_idx;

これは失敗しました:

ERROR:  syntax error at or near "package_tmp_id_idx"
LINE 1: ...T unique_package_id UNIQUE (answer_id) USING INDEX package_tmp_id_idx...
                                                             ^

構文を試してみましたが、機能しませんでした。

既存のUNIQUEインデックスを使用してUNIQUE制約を作成するための正しい構文は何ですか?

6
Adam Matan

一意性制約の列を指定しません。列リストはインデックスを通じて定義されるため、これは必要ありません。

ALTER TABLE package ADD CONSTRAINT 
     unique_package_id UNIQUE USING INDEX package_tmp_id_idx;

マニュアルにその例があります:
http://www.postgresql.org/docs/current/static/sql-altertable.html

ページの最後までスクロールする必要があります