ユニークインデックス
ユニークインデックスとは、対象カラム(複合の場合は組合わせ)の値が重複しないことを保証するインデックスであり、探索の高速化と制約の両方を実現する。
ユニークインデックスとは
ユニークインデックス (unique index) とは、 対象カラム (複合の場合はカラムの組) の値がテーブル全体で重複しないこと を保証するインデックスのこと。 通常のインデックスと同じく検索を高速化する一方で、 INSERT / UPDATE 時に「同じ値が既にあれば拒否する」制約チェックにも使われる。
メールアドレス・ユーザー名・注文番号のような「一意でなければならない値」 に貼るのが典型例。 SQL の UNIQUE 制約は内部的にユニークインデックスを作るので、両者は実質同じ仕組み。 主キーもユニークインデックスの一種 (NULL を許さない特殊版) と考えると整理しやすい。
「同じ値は入れさせない」という保証
ユニークインデックスは検索の高速化に加え、そのカラムの値が重複しないことを保証する制約として機能します。 メールアドレス、ユーザー名、注文番号のように「1つしかあってはいけない値」に付与します。
-- インデックス定義
CREATE UNIQUE INDEX idx_users_email
ON users (email);
-- 挿入
INSERT INTO users(email)
VALUES ('a@example.com');INSERT時、DBはまずUNIQUEインデックスを引いて既に同じ値があるか確認する。 存在すればエラーを返し、なければテーブルとインデックスに書き込む。
(email) UNIQUE※ ここでは分かりやすさのためソート済みリスト風に描いているが、 実際はB-treeで保持されるので探索は O(log N)。 詳しくは B-treeの仕組み へ。
O(log N) で走る。裏でどう動いているか
INSERT時、DBはまずインデックスを引いて「同じ値が既に存在しないか」を確認してから挿入します。 存在すればエラーを返し、無ければインデックスとテーブルの両方に書き込みます。 検索の高速化のためのインデックスが、そのまま制約チェックにも使われる、賢い仕組みです。
使い所
- メールアドレスや外部システムのID(自然キー)
- 複合ユニーク: (user_id, role_id) のような組み合わせで一意にしたいペア
- 論理削除がある場合は「未削除の中で一意」にしたいことが多く、部分ユニークが検討候補
よくある疑問
関連トピック
もっと学びたい方へ(おすすめ書籍)
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。
ドリル 256 問を実際に打ちながら進める SQL の入門書。付属のブラウザ環境で演習できるので、SELECT から結合・集約までを環境構築で止まらずに通せる。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
「なぜこの書き方が速いのか」を実行計画から説明する一冊。条件分岐・集約・結合・更新のそれぞれで、良い書き方と悪い書き方を対比しながら読める。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)