13

実装の詳細であるインデックスの一意性に関するドキュメントを読んだ後、Postgres の一意とインデックスの関係を整理しようとしました。

テーブルに一意の制約を追加するための推奨される方法は、ALTER TABLE ... ADD CONSTRAINT です。一意の制約を強制するためのインデックスの使用は、直接アクセスしてはならない実装の詳細と見なすことができます。ただし、一意の列に手動でインデックスを作成する必要はないことに注意してください。これを行うと、自動作成されたインデックスが複製されるだけです。

したがって、ドキュメントを言葉どおりに解釈して、物事を一意であると宣言し、暗黙的なインデックスを使用します。または、インデックスを作成し、値が一意であるとは想定しません。これは間違いですか? 

unique から取得するインデックスはどのようなものですか? btree のみが一意の制約を受け入れ、unique が暗黙的にインデックスを作成することを考えると、UNIQUE が btree インデックスを作成するのは本当ですか? うっかりハッシュ インデックスで範囲を実行したくありません。 

4

1 に答える 1

21

インデックスを作成し、値が一意であると想定しない

一意のインデックスが定義されている場合は、値が一意であると想定しても安全ですこれが一意の制約の実装方法です (現時点では、おそらく将来のすべてのバージョンでも同様です)。

UNIQUE制約を定義することは、インデックス タイプを指定せずに一意のインデックスを作成することと実質的に同じです (ほぼ、以下を参照)。そして、私はマニュアルを引用します

選択肢は、btree、hash、gist、および gin です。デフォルトのメソッドは btree です。

制約を追加することは、別の方法で実装される可能性がある将来のバージョンで壊れない標準的な方法です。それで全部です。

いいえ、一意の制約は、PostgreSQL v14 までのすべてのバージョンで基本的なbtreeインデックスを使用してのみ実装できます。マニュアルの「ADD table_constraint_using_index」 の段落を引用します。

インデックスに式列を含めることも、部分インデックスにすることもできません。また、デフォルトのソート順の B ツリー インデックスである必要があります。

その他の違いは?

  • ユニーク制約は延期できます。これは、一意のインデックスでは不可能です。コマンドを見て、SET CONSTRAINTS詳細についてはリンクをたどってください。

関連している:

于 2012-01-30T16:22:39.710 に答える