【ユニーク制約】と【複合主キー】って何やねん

SQL

技術メモです。二つが似ていたのでまとめました。

  • ユニーク制約:
    カラム複数で、テーブル内で重複が無いレコードを作る
  • 複合主キー:
    複数のカラムで主キーを作る

スポンサードサーチ

主キーの特徴とユニーク制約の補足

主キー

  • 行を特定できる
  • nullは不可

それに対してユニーク制約のカラムはnullがあっても構いません。

そのため、複合主キーの目的は、複数のカラムで主キーが決まります。すなわち行の特定ができます。

複合キーの設定の例
カラムにActorId,RoleIdという外部キーです。

add constraint [PK_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);

Number,Emailのあとにascとありますが、昇順・降順の設定です。これはインデックスの設定に基づくものです。Numberが1~100あるとして、21のデータを探すには、昇順になっている方が早く見つかります。

また、whereによって、DeletionTimeがnullではない値(すなわち生きているレコード)に対してユニーク制約が効くようになります。この部分は必要に応じてです。

ユニーク制約の目的は行の特定ではなく、重複の無いレコードを作ること(=インデックスを設定する)ということでしょうか。

合っているか分かりませんが、こんなイメージかなと思っています。