受講料が最大70%OFF 受講料が最大70%OFF

データベース関連の処理を実施する際、避けては通れない「主キー」についてきちんと理解出来ているでしょうか。

本記事では、主キー(PRIMARY KEY)制約についての概要から、基本的な使い方をサンプルコードを掲載しながらご紹介していきたいと思います。

主キー(PRIMARY KEY)って何?


最初に主キー(PRIMARY KEY)についての概要をご説明していきます。

データの識別

主キーは、データベースに格納された行データ(レコード)を一意に識別するために設定される項目です。

1つまたは複数カラムに主キーを設定することで、レコードが重複のない一意のデータであることを保証することが可能となります。

ポテパンダの一言メモ

複数カラムに主キーを設定することを複合キーと呼びます。

NOT NULL制約

主キーに設定されたカラムは、レコードを一意に識別する必要があるため、データが空の状態(NULL)が存在してはいけません。

そのため、主キーを設定することで自動的にNOT NULL制約を受けることになります。

主キー(PRIMARY KEY)制約の使い方


では実際に主キー制約をどのように利用するのか、基本的な使い方を確認していきましょう。

1つのカラムに主キー制約を設けるケースと複数カラムで主キー制約を設けるケースの2パターンを解説していきます。

1つのカラムに主キーを設定

1つのカラムに主キーを設定するケースとしては、例えばユーザーを特定するようなケースで利用します。

下記のような「user」テーブルが存在するとします。

user

+------+--------------------+------+
| id   | name               | age  |
+------+--------------------+------+
|    1 | 山田太郎            |   30 |
|    2 | 山田花子            |   25 |
|    3 | 鈴木次郎            |   20 |
|    4 | 田中一              |   40 |
|    5 | 山田太郎            |   30 |
+------+--------------------+------+

idが「1」と「5」のデータは、名前も年齢も同じですが、別人というケースです。

現実として起こり得る問題ですよね。

名前と年齢だけで検索すると双方のデータが該当してしまいますが、id列を主キーに設定しておくことで、同姓同名の別人としてレコードを識別することが可能となります。

複数カラムに主キーを設定

複数カラムを主キーに設定するケースとしては、例えばスタッフを事業所毎に管理するようなケースで利用出来ます。

下記のような「staff」テーブルが存在するとします。

staff

+-----------+----------+-----------------+
| office_id | staff_id | name            |
+-----------+----------+-----------------+
|         1 |        1 | 山田太郎         |
|         1 |        2 | 田中こうた        |
|         2 |        1 | 鈴木雅          |
|         2 |        2 | 瀧本さやか       |
+-----------+----------+-----------------+

今回の場合、「office_id」のみを主キーにしてしまうと、同一事務所で働く人物のデータが複数作れなくなるためふさわしくありません。

そこで「staff_id」との複合キーとすることで、一意のレコードとして識別することが可能となります。

SQLで主キーを定義してみよう


では実際にSQLで主キーを追加する方法を確認していきましょう。

ポテパンダの一言メモ

今回ご紹介するサンプルはMySQLデータベースでの記述法です。
各データベース毎に利用可能なSQL文が異なりますので、ご利用のデータベースの仕様に合わせて適宜読み替えてください。

主キーの追加(テーブル作成時)

まずは主キーをテーブル作成時に追加する方法について確認してみましょう。

CREATE TABLE テーブル名(カラム名 データ型[, データ型, ...], PRIMARY KEY(カラム名[, カラム名, ...]));

上記の利用例で挙げたサンプル「staff」テーブルに当てはめると下記のようになります。

CREATE TABLE staff(office_id int, staff_id int, name varchar(30), PRIMARY KEY(office_id, staff_id));

主キーの追加(テーブル作成後)

テーブル作成後に主キーを追加したい場合「ALTER TABLE」の「ADD PRIMARY KEY」で設定することが可能です。

ALETER TABLE テーブル名 ADD PRIMARY KEY(カラム名[, カラム名, ...]);

「staff」テーブルの例では下記のように記述することが可能です。

ALTER TABLE staff ADD PRIMARY KEY(office_id, staff_id);

主キーの確認

主キーが設定されているのかを確認するためには、MySQLの場合「DESC」コマンドが利用可能です。

DESC テーブル名;

主キー制約を追加した「staff」テーブルに実行してみましょう。

mysql> DESC staff;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| office_id | int         | NO   | PRI | NULL    |       |
| staff_id  | int         | NO   | PRI | NULL    |       |
| name      | varchar(30) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

「Key」項目に「PRI」と表示されていれば、主キーが設定されている証拠です。

主キーの削除

設定した主キーを削除するためには「ALTER TABLE」の「DROP PRIMARY KEY」を利用します。

ALETER TABLE テーブル名 DROP PRIMARY KEY;

「staff」テーブルに設定した主キーを削除してみましょう。

ALTER TABLE staff DROP PRIMARY KEY;

再度テーブル定義を確認する「DESC」コマンドを実行してみます。

mysql> DESC staff;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| office_id | int         | NO   |     | NULL    |       |
| staff_id  | int         | NO   |     | NULL    |       |
| name      | varchar(30) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

Key項目から「PRI(主キー)」の設定が削除されていることをご確認頂けます。

ポテパンダの一言メモ

「ALTER TABLE」の「DROP PRIMARY KEY」は、複合キーの1項目だけを削除することが出来ません。
一度主キー制約を解除した上で、再度必要な項目の主キー制約を追加する必要があります。

さいごに:主キー(PRIMARY KEY)制約を活用したSQLでデータベースの機能を使いこなそう


本記事では、主キー(PRIMARY KEY)制約の概要と基本的な使い方についてご紹介してきました。

主キー制約の理解は、テーブル設計をする上で必須の知識となります。

現状テーブルを作成するような機会がない方も、既存のテーブルがどのような意図で主キー制約を設けているのか考えながら、自分自身でもテーブル設計が出来るように知識を吸収していきましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。