【ユニーク制約】と【複合主キー】って何やねん
技術メモです。二つが似ていたのでまとめました。
- ユニーク制約:
カラム複数で、テーブル内で重複が無いレコードを作る -
複合主キー:
複数のカラムで主キーを作る
スポンサードサーチ
主キーの特徴とユニーク制約の補足
主キー
- 行を特定できる
- nullは不可
それに対してユニーク制約のカラムはnullがあっても構いません。
そのため、複合主キーの目的は、複数のカラムで主キーが決まります。すなわち行の特定ができます。
複合キーの設定の例
カラムにActorId,RoleIdという外部キーです。
add constraint [PK_ActorId_RoleId]
primary key (ActorId, RoleId);
primary key (ActorId, RoleId);
PK_ActorIt_RoleIdは、複合主キーに対して名前を付けています。
ユニーク制約
ユニーク制約を設定するという事は、UNIQUEインデックスを設定することと同義になります。
インデックスとは、SQLサーバーがデータを探しやすくするための設定です。
そのため、ユニーク制約を決めるときは、インデックスを決める設定もしなければなりません。
ユニーク制約の例
CustomerのNumberとEmailで重複しないレコードを作っています。
create unique index UQ_Customer_Number_Email on
acc.[Customer]( Number asc, Email asc )
where (DeletionTime is null);
acc.[Customer]( Number asc, Email asc )
where (DeletionTime is null);
Number,Emailのあとにascとありますが、昇順・降順の設定です。これはインデックスの設定に基づくものです。Numberが1~100あるとして、21のデータを探すには、昇順になっている方が早く見つかります。
また、whereによって、DeletionTimeがnullではない値(すなわち生きているレコード)に対してユニーク制約が効くようになります。この部分は必要に応じてです。
ユニーク制約の目的は行の特定ではなく、重複の無いレコードを作ること(=インデックスを設定する)ということでしょうか。
合っているか分かりませんが、こんなイメージかなと思っています。