これまで、主キー(Primary key)は、テーブルに1つしか存在しないと思っていたのですが、SQL Serverで1つのテーブルに2つのPRキーが存在してるじゃないですか!と思って職場の先輩にお聞きしたところ、「複数カラムの組で主キーを構成している」ということでした。
テーブルに主キー(Primary key)は1つという認識は間違っていなかったようです。
下記のようなテーブルを作成した場合、『取引先コード』、『作業員コード』のそれぞれが主キーを1つづつ持つわけではなく、『取引先コード』と『作業員コード』の組み合わせに対して1つの主キーを持つようです。
これは、複合キー(composite key )に主キー(Primary key)を使っていることから、 複合主キー(composite primary key ) というようです。
複合キーに外部キーも指定できるようです。
複合キー は、主キーまたは外部キー制約の複数の列を指定します。
⇩ CakePHP3は複合キーにも対応しているようです。
・CakePHP3 の bake が 2.x と比べてどう変わったのか。 - Qiita
複合主キーを実装したテーブルの例
主キー | フィールド名 | データ型 | Null許容しない |
---|---|---|---|
取引先コード | varchar(4) | 許容しない | |
作業員コード | varchar(8) | 許容しない | |
氏名 | varchar(50) |
この場合、『取引先コード』と『作業員コード』の組み合わせでの重複はNGのようです。
OKの例
企業コード | 作業員コード | 氏名 |
---|---|---|
0001 | 00000001 | 佐藤 |
0001 | 00000002 | 鈴木 |
0002 | 00000001 | 高橋 |
0002 | 00000002 | 田中 |
0003 | 00000001 | 伊藤 |
NGの例
企業コード | 作業員コード | 氏名 |
---|---|---|
0001 | 00000001 | 佐藤 |
0001 | 00000001 | 鈴木 |
0002 | 00000001 | 高橋 |
0002 | 00000002 | 田中 |
0003 | 00000001 | 伊藤 |
NG例では、佐藤さんと鈴木さんの『企業コード』と『作業員コード』の組み合わせがダブってしまっているので、主キーの条件を満たしていないので実際にはテーブルにデータは入りません、たぶん。
1個の表で、複数個のプライマリキーを持つことはできません。
1個以上の列の組で、1個のプライマリキーを定義することはできます。
複数のカラムを組み合わせたものにPRIMARY KEY制約が設定されている場合は、複数のカラムに格納された値と同じ組み合わせの値を格納することはできません。
SQLで複合主キーを設定してテーブルを作成する場合は、下記のような記述でいけるようです。この場合、CustomerIDとCustomerNameの組み合わせが主キーとなります。
CREATE TABLE Customers( CustomerID nvarchar(20), CustomerName nvarchar(20), CustomerAdd nvarchar(50) NULL. PRIMARY KEY(CustomerID,CustomerName));
既に作成済みのテーブルに複合主キーを設定する場合は、下記のように記述でいけるようです。
tbl_nameというテーブルを作成し、col_name1、col_name2というフィールドを用意用意している場合
ALTER TABLE tbl_name ADD PRIMARY KEY(col_name1, col_name2);
⇩ データベースはキーだけでも7つもあるようです。
・データベースに色々あるキーについて、調べてみたら7種類もあったので備忘録的に列挙してみた。(データベーススペシャリストの勉強) | メサイア・ワークス
⇩ 代替キー(Surrogate key)と複合キー(Composite key)について
「サロゲートキー vs 複合キー」という間違った対立 - ネットの海の片隅で
DBの設計も激難ですね。今回はこのへんで。
今回はこのへんで。