Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

PRIMARY KEY(主キー)とは?

PRIMARY KEYとは、値を指定することである1行を完全に特定できるという役割を担った列のことです。

会社で言えば社員番号やマイナンバーのように、番号によって個人を紐付けるイメージですね。

PRIMARY KEYは、テーブルごとに1つだけ設定できます。

列(カラム)にPRIMARY KEY制約を設定した場合、列には他の行の値と重複しない値のみ格納されるようになります。また、NULLも格納できないため、何かしらの値が格納されます。

これによって、PRIMARY KEY制約を設定した列の値を検索すると、テーブルの中で唯一のデータを特定可能です。

PRIMARY KEYの役割

PRIMARY KEYの役割は、大きく分けて次の2つあります。

PRIMARY KEYは前述したように、他のデータと重複しないユニークな値が設定されます。

そのため、PRIMARY KEYが設定されたデータ群は整合性が保証されていると言えるのです。

また、PRIMARY KEYで検索をかけた場合、必要なデータを特定できるため検索スピードもアップします。

データベースのテーブルのほとんどは、PRIMARY KEYが設定されているといっても過言ではありません。

設定することにデメリットもなく、上記にあげた重要な役割がPRIMARY KEYにはあります。

PRIMARY KEY制約の作成方法

PRIMARY KEY制約は、基本的にテーブルを作成する際に一緒に設定します。

テーブル作成と合わせてPRIMARY KEY制約を設定する場合の書式は次の通りです。

CREATE TABLE db_name.tbl_name
  (col_name data_type NOT NULL PRIMARY KEY, ...)

複数のカラムと組み合わせてPRIMARY KEY制約を設定する場合は、次の通りです。

CREATE TABLE db_name.tbl_name
  (col_name data_type NOT NULL, ..., PRIMARY KEY(col_name, ...))

PRIMARY KEYは、カラムのデータ型の後ろに記述します。

また、PRIMARY KEYを設定するカラムには、「NOT NULL制約」の設定が必要です。

明示的に設定しなくてもエラーは発生せず、NOT NULL制約は自動的に設定されます。

では、サンプルで入力方法を確認してみましょう。

CREATE TABLE sample_tb (
    user_id int NOT NULL,  -- ユーザーID
    name varchar(20), -- 名前
    age int, -- 年齢
    sex varchar(10), -- 性別
    PRIMARY KEY(user_id)
);

「sample_tb」にユーザーID、名前、年齢、性別をもったテーブルを作成すると同時に、ユーザーID(user_id)にPRIMARY KEYを設定しました。

PRIMARY KEYの設定ができたか確認してみると、次のような形になっているはずです。

SHOW COLUMNS FROM sample_tb; 


+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| user_id | int         | NO   | PRI | NULL    |       |
|  name   | varchar(20) | YES  |     | NULL    |       |
| age     | int         | YES  |     | NULL    |       |
| sex     | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

user_idのKeyカラムに「PRI」と表示されれば、PRIMARY KEYの設定ができています。

PRIMARY KEYを後から追加する

作成時にはPRIMARY KEYを設定せず、後から追加したい場合は、次のコマンドで設定可能です。

ALTER TABLE テーブル名 ADD PRIMARY KEY(列名);

では、先ほどのテーブルを少し変更して確認してみましょう。

CREATE TABLE sample_tb (
    user_id int NOT NULL,  -- ユーザーID
    name varchar(20), -- 名前
    age int, -- 年齢
    sex varchar(10) -- 性別
);

このテーブルを作成すると、テーブルの定義は次のようになっているはずです。

+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| user_id | int         | NO   |     | NULL    |       |
|  name   | varchar(20) | YES  |     | NULL    |       |
| age     | int         | YES  |     | NULL    |       |
| sex     | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

Keyカラムに「PRI」が表示されていないので、PRIMARY KEYが定義されていないのが確認できますね。

ここで、先ほど説明したALTER TABLE文で「ユーザーID(user_id)」にPRIMARY KEY制約を追加します。

ALTER TABLE sample_tb ADD PRIMARY KEY(user_id);
SHOW COLUMNS FROM sample_tb;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| user_id | int         | NO   | PRI | NULL    |       |
|  name   | varchar(20) | YES  |     | NULL    |       |
| age     | int         | YES  |     | NULL    |       |
| sex     | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

上記のように、ALTER TABLE文によってuser_idにPRIMARY KEYを後から追加できました。

PRIMARY KEYを削除する

設定したPRIMARY KEY制約を削除したい場合は、次のコマンドを入力します。

ALTER TABLE テーブル名 DROP PRIMARY KEY;

こちらもサンプルで確認してみましょう。

先ほど「PRIMARY KEYを後から追加する」で追加したPRIMARY KEYを削除してみます。

ALTER TABLE sample_tb DROP PRIMARY KEY;
SHOW COLUMNS FROM sample_tb;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| user_id | int         | NO   |     | NULL    |       |
|  name   | varchar(20) | YES  |     | NULL    |       |
| age     | int         | YES  |     | NULL    |       |
| sex     | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

テーブルを表示してみると、PRIMARY KEYが削除されているのがわかります。

PRIMARY KEYを変更する

PRIMARY KEYを別のカラムに変更するSQLコマンドはありません。

PRIMARY KEYを変更したい場合は、一度PRIMARY KEYを削除してから新規作成もしくは追加します。

PRIMARY KEYの削除は「PRIMARY KEYを削除する」をPRIMARY KEYの追加は「PRIMARY KEYを後から追加する」を参考にしてください。

PRIMARY KEYを複数のカラムに追加する

PRIMARY KEYは、テーブルに1つのみ設定できると解説しましたが、対象になるカラムは 1つのみではなく複数のカラムを組み合わせて設定可能です。

例えば、2つのカラムを組み合わせてPRIMARY KEYを設定すると、 2つのカラムに格納された値の組み合わせは他のデータと重複しません。

ではサンプルコードでPRIMARY KEYを複数のカラムに追加してみましょう。

CREATE TABLE sample_tb (
    user_id int NOT NULL,  -- ユーザーID
    create_year int, -- 作成年
    name varchar(20), -- 名前
    age int, -- 年齢
    sex varchar(10), -- 性別
    PRIMARY KEY(user_id, create_year)
);

ここでは「ユーザーID(user_id)」と「作成年(create_year)」にPRIMARY KEYを定義してみます。

複数のカラムにPRIMARY KEYを設定する場合は、カンマ区切りでつなげればOKです。

+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| user_id     | int         | NO   | PRI | NULL    |       |
| create_year | int         | NO   | PRI | NULL    |       |
|  name       | varchar(20) | YES  |     | NULL    |       |
| age         | int         | YES  |     | NULL    |       |
| sex         | varchar(10) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+

user_idとcreate_yearにPRIMARY KEYが設定できました。

試しにデータを追加してみましょう。

INSERT INTO sample_tb VALUES(1, 2019, 'Abe', 33, 'Male');
INSERT INTO sample_tb VALUES(2, 2019, 'Satou', 38, 'Male');
INSERT INTO sample_tb VALUES(1, 2020, 'Kasai', 27, 'Female');
+---------+-------------+--------+------+--------+
| user_id | create_year |  name  | age  | sex    |
+---------+-------------+--------+------+--------+
|       1 |        2019 | Abe    |   33 | Male   |
|       1 |        2020 | Kasai  |   27 | Female |
|       2 |        2019 | Satou  |   38 | Male   |
+---------+-------------+--------+------+--------+

PRIMARY KEYを設定した user_idとcreate_yearの値は、2つのカラムの組み合わせでは重複していないので、user_idの「1」が重複したデータでも問題ありません。

ただし、次のようにuser_idとcreate_yearの値の組み合わせが、他のデータと重複している場合はエラーになります。

INSERT INTO sample_tb VALUES(2, 2019, 'Takahashi', 31, 'Female');
ERROR 1062 (23000): Duplicate entry '2-2019' for key 'sample_tb.PRIMARY'

PRIMARY KEYをUPDATEする方法

PRIMARY KEYをUPDATE文で書き換えてみましょう。

ここでは、「PRIMARY KEYを複数のカラムに追加する」で追加したデータのuser_idを更新してみます。

UPDATE sample_tb SET user_id = user_id + 1 ORDER BY user_id DESC;

ORDER BYを設定しないと、idが重複してエラーになってしまうためidを降順に設定しています。

+---------+-------------+--------+------+--------+
| user_id | create_year |  name  | age  | sex    |
+---------+-------------+--------+------+--------+
|       2 |        2019 | Abe    |   33 | Male   |
|       2 |        2020 | Kasai  |   27 | Female |
|       3 |        2019 | Satou  |   38 | Male   |
+---------+-------------+--------+------+--------+

まとめ

SQLのPRIMARY KEYについて解説しました。

PRIMARY KEYは、テーブル作成においてほぼ必須で設定する重要な機能です。

ぜひこの記事を参考にPRIMARY KEYを使いこなしてください。

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

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

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

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

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

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

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

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

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

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

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