一意制約とインデックスは両方とも、データベース テーブル内のデータの一意性を保証するために使用されます。ただし、2 つのアプローチにはいくつかの重要な違いがあります。
一意の制約
CONSTRAINT
キーワードを使用してテーブル定義で明示的に定義されます。 インデックス
CREATE INDEX
ステートメントを使用して作成されます。 Postgres のドキュメントによると、テーブルに一意制約を追加するには ALTER TABLE ... ADD CONSTRAINT
を使用することが推奨されています。これは、特に一意性を強制するための一意のインデックスの作成は実装の詳細とみなされ、直接アクセスすべきではないためです。
パフォーマンス: 一般に、一意制約と一意インデックスは、クエリ速度の点で同様のパフォーマンスを発揮します。ただし、部分インデックスを使用すると、データのサブセットのみにアクセスするクエリのパフォーマンスを向上させることができます。
外部キー: 一意制約は外部キーによって参照できますが、一意のインデックスは参照できません。
制約のオーバーヘッド: 一意制約は、データの挿入または更新時に追加のメンテナンス操作が必要になるため、一意のインデックスと比較してわずかなオーバーヘッドがあります。
一意制約とインデックスの違いを説明するために、一意制約と一意インデックスの両方を持つテーブルを作成してみましょう。
<code class="language-sql">CREATE TABLE foo ( id SERIAL PRIMARY KEY, code INTEGER, label TEXT, CONSTRAINT foo_uq UNIQUE (code, label) ); CREATE UNIQUE INDEX foo_idx ON foo (code, label);</code>
一意制約 (foo_uq) と一意インデックス (foo_idx) の両方により、(コード、ラベル) の組み合わせの一意性が強制されます。ただし、Postgres では一意の制約が推奨されるアプローチであるため、一意の制約を使用することをお勧めします。
部分インデックス
部分インデックスを作成するには、CREATE INDEX
ステートメント内で WHERE
句を使用します。
<code class="language-sql">CREATE UNIQUE INDEX foo_partial_idx ON foo (code) WHERE label IS NOT NULL;</code>
このインデックスは、 label
が NULL
ではない行にのみ適用されます。
インデックスを使用して制約を追加する
部分インデックスを使用して一意制約を追加することはできません。ただし、既存の一意のインデックスを使用して一意制約を作成できます:
<code class="language-sql">ALTER TABLE foo ADD CONSTRAINT foo_partial_uq UNIQUE USING INDEX foo_partial_idx;</code>
以上がPostgres の固有制約とインデックス: いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。