【ふくごうきー】
複合キー とは?
最終更新:
💡 一つでは重なっても、組み合わせで見分ける
複数の列の値を組み合わせて、データベースの行を識別するキー。主キーに採用したものを複合主キーという。一つの列では重なる値でも、組み合わせを一意にするよう制約を定められる。
一つの列だけで、行を見分けられないことがある?
あるよ。たとえば、一人が同じ商品を一度だけお気に入り登録する表を考えよう。ユーザーだけでは商品が違う行を見分けられず、商品だけでもユーザーが違う行を見分けられない。ユーザーと商品の組を一意にすると、一つの登録を識別できるんだ。
複合キーと複合主キーは、同じ?
複数の列で作るキーのうち、表の主キーに採用したものが複合主キーだよ。たとえばPostgreSQLではPRIMARY KEY (user_id, product_id)と指定でき、その組み合わせの重複と各列のNULLを禁止する。複数列を組み合わせた検索用インデックスが、必ず主キーや一意なキーになるわけではないよ。
お気に入り用のIDを付けてもいい?
列の順番を入れ替えると、重複の判定も変わる?
同じ二列なら、組み合わせが重複するかという条件は変わらないよ。一方、検索用のインデックスでは順番が効率に関わることがある。先頭以外の列だけでは絶対に使えない、とも限らない。PostgreSQL 18には条件によって使うskip scanもあるので、実際の検索計画を確認しよう。
複合主キーは、アプリでもそのまま使える?
もっと詳しく知りたい人へ
主キーなら、どのDBでもNULLは同じ扱い?
製品の仕様を確認しよう。PostgreSQLの主キーは各列がNOT NULLになる。一方、SQLiteには通常のテーブルの主キーでNULLを許す歴史的な例外があり、STRICTやWITHOUT ROWIDなどの条件で扱いが変わる。複数のDBへ移すときも、制約が実際にどう守られるか確かめよう。
まとめ:ざっくりこれだけ覚えればOK!
「複合キー」って出てきたら「複数の列を組み合わせて、行を見分けるキー」と思えばだいたいOK!
📖 おまけ:英語の意味
「Composite Key」 = 複数の要素からなるキー
💬 compositeは複数の要素からなるという意味。複合キーは主キーとして使う場合だけに限らず、その中で主キーに採用したものを複合主キーと呼ぶよ。