SQLのCREATE TABLEでテーブルに主キー(PRIMARY KEY)制約を設定する

SQLのCREATE TABLE文を使うことで、データベースにテーブルを作成することができます。

基本的なテーブルの作成
データベースのテーブルを作成するSQL CREATE TABLE
SQL文では、既存のテーブルに対してINSERT、UPDATE、DELETEなどのステートメントを使用して、テーブルやビューのデータ(レコー...

上記の記事では、CREATE TABLE文を使用して、データベーステーブルの作成する方法について簡単にご紹介しています。

しかし、上記の記事では最もシンプルにテーブルを作成する方法についてのみ触れているので、テーブル内のレコード(データ)を一意に判別するためのキー(ユニークキー)となる列を設定する方法は省いています。

データベースに作成するテーブルでは、ほとんどの場合、テーブル内のそれぞれのレコードを判別するために、重複しない値が設定される列を設定します。
この値が重複しない(値が一意となる)キー列のことをデータベースでは、主キー(プライマリキー: PRIMARY KEY)と呼びます。

そこで今回は、CREATE TABLE文を使ってテーブルを作成する際に、レコードの識別子となる主キーを指定する方法について紹介します。

主キー(プライマリキー)を設定するサンプルテーブル

主キーを設定するテーブルとして、以下のテーブルを用意します。

顧客マスタ

列名 データ型
顧客コード varchar(5)
顧客名 varchar(50)
連絡先 varchar(200)

商品マスタ

列名 データ型
商品コード varchar(8)
商品名 varchar(100)
単価 int

注文テーブル

列名 データ型
注文番号 int
注文日 date
顧客コード varchar(5)

注文明細テーブル

列名 データ型
注文番号 int
明細番号 int
商品コード varchar(8)
数量 int
金額 int

テーブルを作成するSQL(CREATE TABLE)

顧客マスタ

商品マスタ

注文テーブル

注文明細テーブル

主キー(プライマリキー)の設定

主キーの設定にはPRIMARY KEYキーワードを使用します。
PRIMARY KEYキーワードは主キーとして扱う列に対して指定します。
intやvarcharなどのデータ型を定義している箇所の後ろにスペース文字列を入力し、その後に「PRIMARY KEY」を記述します。

列名 データ型 PRIMARY KEY

例えば、顧客マスタの顧客コードを主キーにする場合の列定義は以下のようになります。

主キーの設定を付加した顧客マスタのCREATE TABLE文のSQLは以下のようになります。

PRIMARY KEYを指定することで、主キーに設定した列の値をもとにテーブルのレコードを一意(ユニーク)に特定することができるようになります。

データベースのテーブルの主キー正常

主キーとして設定した列には、重複した値を登録することができなくなります。(同じ値を持つ複数のレコードを登録できなくなります。)→ UNIQUE制約

データベースのテーブルの主キー重複違反

また、NULLを登録することもできなくなります。→ NOT NULL制約

データベースのテーブルの主キーNULL違反

サンプルテーブルの商品マスタについても主キーを設定してみます。
商品マスタは顧客マスタの顧客コードと同様に、商品を識別できる商品コードがありますので、商品コードに主キーが設定できます。

次に注文テーブルと注文明細テーブルについて、主キーになる列を考えてみます。
注文情報はそれぞれの注文を注文番号で識別できますので、注文テーブルの主キーは注文番号になります。
注文明細情報は、注文情報の明細としてどのような商品が注文されたかを管理することになりますので、注文番号と明細番号が主キーとなります。

注文テーブル
列名 データ型 主キー
注文番号 int
注文日 date
顧客コード varchar(5)
注文明細テーブル
列名 データ型 主キー
注文番号 int
明細番号 int
商品コード varchar(8)
数量 int
金額 int

それぞれのテーブルに対して主キーを設定するCREATE TABLE文を記述してみます。

注文テーブル

注文明細テーブル

上記のSQLを実行してみると、注文テーブルは正常に実行されます。
しかし注文明細テーブルの方は、以下のエラーが発生してしまいます。

テーブル ‘注文明細’ に複数の PRIMARY KEY 制約を追加できません。

これはSQLの仕様によるものです。

主キーとなる列が1つの場合は、列の定義にPRIMARY KEYキーワードを指定すればいいのですが、主キーが複数の場合は各列の定義にPRIMARY KEYキーワードを記述する方法が使用できません。
PRIMARY KEYキーワード(PRIMARY KEY制約)は、テーブルに対して1つの列にしか指定することができないからです。

仕様ということは、テーブルに複数の主キーがある場合には、SQLで設定することができないのでしょうか…

実は主キーが複数の場合には別の方法で指定することで、複数の主キーを設定することが可能です。
主キー(PRIMARY KEY)の定義は、それぞれの列に定義する以外にも、一括して定義することができる仕様が用意されているからです。

主キーが複数の場合の指定方法

主キーが複数の場合は、PRIMARY KEYキーワードを使用した主キーの指定方法を列ごとに行うのではなく、テーブルに対して行います。
テーブルに対するPRIMARY KEYキーワードの指定は、列定義を記述した後に行います。

CREATE TABLE テーブル
(
列1の名前 列1のデータ型,
列2の名前 列2のデータ型,
列3の名前 列3のデータ型,

PRIMARY KEY(主キーとなる列名1, 主キーとなる列名2…)
);

以下に注文明細テーブルの注文番号と明細番号を主キーとして設定する場合のCREATE TABLE文を記載します。

注文明細テーブルの主キーの定義を含んだCREATE TABLE文

上記の例では主キーが2つですが、3つ以上の場合も列名をカンマで区切ってしてすることで、主キーを定義することができます。

この主キー制約の指定方法(PRIMARY KEYキーワードの使用方法)は、主キーが1つの場合でも有効です。

注文テーブルの主キーの定義を含んだCREATE TABLE文

こちら主キーの定義方法を覚えて置けば、SQLのCREATE TABLE文で主キーを設定する時にエラーが発生することはありません。

補足

プライマリーキー(PRIMARY KEY)制約と同様に重複したレコードを作成できないようにする制約にユニーク(UNIQUE)制約というものがあります。
ユニーク制約が設定された列も重複した値を登録することはできません。しかし、NULLを登録することはできます。
ユニーク制約が設定された列にNULLを登録できないようにするには、NOT NULL制約を指定することになります。
UNIQUE制約とNOT NULL制約の両方を指定することで、PRIMARY KEY制約と同等のことができますが、通常はレコードを識別するための列である主キーにはPRIMARY KEY制約を使用します。
ただし、主キーとは別にレコードを特定するための列が必要な場合は、UNIQUE制約とNOT NULL制約を指定する場合もあります。