主キーとは
主キー(primary key)とは、リレーショナルデータベース(RDB)において、レコードを一意に識別するのに最も適した項目として設計者が選定したカラムを指します。主キーを設定することでデータベースの中から欲しいデータを効率的に探しやすくなります。そのため主キーでどれを選ぶかはデータベース設計において重要です。
レコードを構成する項目のうち、1つまたは複数の組み合わせ(複合主キー)を主キーとして選定します。単一のリレーションの中に、候補キーの組み合わせパターンが複数ある場合は使用頻度の高いものを主キーにするのが一般的です。主キーは通常、数値型のカラムにするのが一般的ですが、文字列や日付などでも問題ありません。
主キーの決め方
主キーの選定には「スーパーキー」の中から「候補キー」を取り出し、そこから「主キー」を選定します。
キーの種類
いずれのキーもテーブルからレコードを一意に特定できるキーですが、下記のような違いがあります。
スーパーキー | レコードを一意に識別するための属性またはその組み合わせ |
候補キー | スーパーキーのうち、レコードを一意に識別するのに必要最低限の組み合わせ 主キーとして選択可能な項目またはその組み合わせ |
主キー | あるテーブルのレコードを特定するための識別子 候補キーのうち、識別子として最適なものとして選定した1つの候補キー |
外部キー | リレーションにおいて主キーを参照する属性 |
候補キーから主キーを選定する基準
NOT NULL制約かつ一意制約であること(主キー制約)
主キーにNULL値(値が存在しない状態)は指定できないという制約があります。これを「NOT NULL制約」といいます。また、値が重複せず一意であることが求められます。これを「一意(UNIQUE)制約」といいます。
データ量が少ない
主キーには、できるだけデータ量が少なく、簡潔な項目であることが求められます。
更新がかからない
主キーには、更新がかからない項目を選定する必要があります。値が変更されない永続性がある項目を選びましょう。
具体例で見てみよう
下記のテーブルを見てみましょう。
「従業員(employee)」テーブル
従業員ID(employee_id) | 氏名(name) | 部署ID(dept_id) |
0001 | 阿部 | 5 |
0002 | 菊池 | 1 |
0003 | 鈴木 | 6 |
0004 | 田中 | 4 |
0005 | 野村 | 2 |
0006 | 長谷川 | 3 |
0007 | 田中 | 6 |
0008 | 山田 | 5 |
0009 | 渡辺 | 7 |
上記のテーブルの場合主キーに適しているのは、「従業員ID」カラムです。「氏名」カラムや「部署ID」カラムでは同一の氏名や部署がある場合にどのレコードを指しているかわからないです。また、もし部署配属されていない人がいる場合は部署ID項目が空白になってしまいます。その点、「従業員ID」カラムではデータが重複しないため各レコードを特定できます。
主キーの設定方法
主キーの設定方法は、データベース管理システム(DBMS)によって異なりますが、一般的なMySQLやPostgreSQLといったDBMSではテーブルを作成する「CREATE TABLE」文の中で、主キーに指定するカラムにPRIMARY KEY制約を記述することで設定できます。
【使用イメージ1】
CREATE TABLE テーブル名(
カラム名 型 PRIMARY KEY,
カラム名 型,
カラム名 型,
……
);
【使用イメージ2】
CREATE TABLE テーブル名(
カラム名 型,
カラム名 型,
カラム名 型,
……
PRIMARY KEY(カラム名)
);
また、既存のテーブルに主キーを設定する場合は、「ALTER TABLE」文を使用します。
【使用イメージ】
ALTER TABLE テーブル名 ADD PRIMARY KEY (カラム名);
【実行コード】
CREATE TABLE employee(
employee_id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR,
dept_id INTEGER,
);
MySQLで主キーを確認する場合は、DESC文を使用します。
【使用イメージ】
DESC テーブル名;
【実行コード】
DESC employee;
Field | Type | Null | Key | Default | Extra |
employee_id | int | NO | PRI | NULL | |
name | varchar | YES | NULL | ||
dept_id | int | YES | NULL |
Key項目で“PRI”と表示されているカラムが主キーとして設定されています。
主キーの削除方法
主キーを削除する場合は、同様に「ALTER TABLE」文を使用します。
【使用イメージ】
ALTER TABLE テーブル名 DROP PRIMARY KEY;
確認してみると、主キー設定が削除されたことが分かります。
Field | Type | Null | Key | Default | Extra |
employee_id | int | NO | NULL | ||
name | varchar | YES | NULL | ||
dept_id | int | YES | NULL |
複数カラムを主キーに設定する方法
複数カラムを主キーに設定することも可能です。たとえば、「氏名+部署ID」で一意になるとしましょう。その場合はこの2つを合わせて主キーとします。これを複合キーといい、適切な項目を選ぶことで複雑なデータベースでもデータの整合性を保てます。
【使用イメージ】
PRIMARY KEY(カラム名,カラム名……)
DESC文で確認すると次のようになります。
Field | Type | Null | Key | Default | Extra |
employee_id | int | NO | NULL | ||
name | varchar | YES | PRI | NULL | |
dept_id | int | YES | PRI | NULL |
SQL関連記事
- RDBを操作するデータベース言語「SQL」とは?
- RDB以外のデータベース管理システム「NoSQL」とは?
- RDB管理システム「MySQL」とは?
- RDB管理システム「PostgreSQL」とは?
- RDB管理システム「SQL Server」とは?
- RDB管理システム「SQLite」とは?
- ブラウザ上でMySQLを管理できる「phpMyAdmin」とは?
- データを抽出する「SELECT」文
- データを追加する「INSERT」文
- データを削除する「DELETE」文
- データを更新する「UPDATE」文
- 抽出条件を指定する「WHERE」句
- 抽出条件を指定する「HAVING」句
- 複数の抽出条件をまとめる「IN」句
- 重複レコードを除外する「DISTINCT」
- 抽出範囲を指定する「BETWEEN」演算子
- 抽出条件を満たすレコードの存在の有無を調べる「EXISTS」句
- レコード件数を取得する集計関数「COUNT」関数
- レコードをグループ化する「GROUP BY」句
- 抽出結果を並び替える「ORDER BY」句
- テーブル間のデータを結合する「JOIN」句
- 内部結合「INNER JOIN」句
- 抽出結果を統合して表示する「UNION」句
- データの曖昧検索「LIKE」句
- 条件分岐処理「CASE」式
- 「NULL」の扱い方
SQLの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。