読者です 読者をやめる 読者になる 読者になる

主キー(primary key)を複数のカラムに、その名は複合主キー(composite primary key )

これまで、主キー(Primary key)は、テーブルに1つしか存在しないと思っていたのですが、SQL Serverで1つのテーブルに2つのPRキーが存在してるじゃないですか!と思って職場の先輩にお聞きしたところ、「複数カラムの組で主キーを構成している」ということでした。

テーブルに主キー(Primary key)は1つという認識は間違っていなかったようです。

 

下記のようなテーブルを作成した場合、『取引先コード』、『作業員コード』のそれぞれが主キーを1つづつ持つわけではなく、『取引先コード』と『作業員コード』の組み合わせに対して1つの主キーを持つようです。

これは、複合キー(composite key )に主キー(Primary key)を使っていることから、 複合主キー(composite primary key ) というようです。

複合キーに外部キーも指定できるようです。

複合キー は、主キーまたは外部キー制約の複数の列を指定します。

IBM Knowledge Center

⇩  CakePHP3は複合キーにも対応しているようです。

CakePHP3 の bake が 2.x と比べてどう変わったのか。 - Qiita

 

複合主キーを実装したテーブルの例 

主キーフィールド名データ型Null許容しない

f:id:ts0818:20170204143130p:plain

取引先コード varchar(4) 許容しない

f:id:ts0818:20170204143130p:plain

作業員コード 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個のプライマリキーを定義することはできます。

2つのカラムに主キーを設定するには? - Database Expert - @IT

複数のカラムを組み合わせたものにPRIMARY KEY制約が設定されている場合は、複数のカラムに格納された値と同じ組み合わせの値を格納することはできません。

PRIMARY KEY制約 - SQLite入門

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の設計も激難ですね。今回はこのへんで。

広告を非表示にする