データベース関連の処理を実施する際、避けては通れない「主キー」についてきちんと理解出来ているでしょうか。
本記事では、主キー(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)制約の概要と基本的な使い方についてご紹介してきました。
主キー制約の理解は、テーブル設計をする上で必須の知識となります。
現状テーブルを作成するような機会がない方も、既存のテーブルがどのような意図で主キー制約を設けているのか考えながら、自分自身でもテーブル設計が出来るように知識を吸収していきましょう。
複数カラムに主キーを設定することを複合キーと呼びます。