Open5
DBのキー制約(外部キー, 複合主キー, ユニーク制約など)について
主キー, 複合主キーとは?
主キー制約 (PRIMARY KEY)と一意性制約(UNIQUE KEY)の違いについて
外部キー(foreign key)制約について
リレーショナルデータベース(RDBMS)においては、データを参照される側と参照する側で親子関係が成り立っています。
参照される側の表を親テーブル(またはマスターテーブル)、参照する側の表を子テーブル(またはトランザクションテーブル)と呼びます。
RDBMSでは、外部キー制約(または参照整合性制約)という制約をつけることが出来ます。
外部キー制約は、表作成時に参照する側の表につけます。
また、参照先の列は、そのテーブルの主キーである必要があります。
これは主キーが重複を許さず、「NOT NULL」であるというルールがあるためです。
1対1の関係を確保するためには、子テーブル側の外部キーにユニーク制約を設ける必要があります。
通常、外部キー制約は子テーブルで定義します。
子テーブルの外部キー列が親テーブルの主キーや一意キーを参照することで、データの整合性を保つことができます。
これにより、子テーブルに入力されるデータが、必ず親テーブルの対応するレコードと一致することが保証されます。
複合主キー制約と複合ユニーク制約の違い
ユースケースで複合ユニークキーが必要となる場合
複合ユニークキーが必要になるのは、組み合わせによって一意性を保証したい時に使います。
例えば:
- 多対多の関係を管理する中間テーブルで、特定の2つのIDの組み合わせが一意であることを保証したい場合。
- 例: ユーザーとロールの関係を管理する user_roles テーブルで、user_id と role_id の組み合わせにユニーク制約を設ける。
- 同じ外部キーを持つ複数のレコードが存在し得るが、その組み合わせは一意でなければならない場合。
外部キーでインデックスが貼られるかどうか?
DBによって、外部キー制約を付与で、インデックスが自動で貼られるかどうかに差がある。
- MySQL は、外部キー制約をつけたカラムにインデックスが貼られる
- PostgreSQL は、明示的に宣言する必要がある