「主キー」と「一意キー」

ID番号のように重複したらまずい値があります。

もし、ID番号が2つあったら、どちらを使えばいいかわからなくなってしまいます。

データベースでは、このような重複を許さない値を設定することができます。

それば、「主キー」と「一意キー」です。

ここでは、これらのキーの設定方法を紹介します。

 

主キー

では、主キーについて説明します。

 

主キー(primary key)とは

値が他と重複しない

何もデータが入力していない状態はない

という性質もったカラムのことです。構文は以下の通りです。

CREATE TABLE テーブル名 (カラム名 データ型 PRIMARY KEY…);

 

では、さっそくidを主キーとして、idとnameをカラムとしたテーブルmy_tb_pkeyをつくってみます。

mysql> CREATE TABLE my_tb_pkey(id VARCHAR(10) PRIMARY KEY,name VARCHAR(10));

とすれば、

mysql> CREATE TABLE my_tb_pkey(id VARCHAR(10) PRIMARY KEY,name VARCHAR(10));
Query OK, 0 rows affected (0.01 sec)

と表示されます。実際にDESCで見てみると

mysql> DESC my_tb_pkey;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | varchar(10) | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

となっており、KeyのところがPRIとなっています。これは、主キーであることを示しています。

また、NullがNoになっているので、必ずデータを入れる必要があります。

 

実際に重複できないか調べるため、値をいくらか入れてみます。

まず、idにyamada、nameに山田太郎といれてみます。すると、

mysql> INSERT INTO my_tb_pkey VALUES('yamada','山田太郎');

となります。値を見てみると

mysql> SELECT * FROM my_tb_pkey;

+--------+--------------+
| id     | name         |
+--------+--------------+
| yamada | 山田太郎     |
+--------+--------------+
1 row in set (0.00 sec)

となっています。

 

では、id:yamada、name:山田美智子として値を入れてみます。すると

mysql> INSERT INTO my_tb_pkey VALUES(‘yamada’,’山田美智子’);
ERROR 1062 (23000): Duplicate entry ‘yamada’ for key ‘PRIMARY’

となります。予想どおり、主キーが重複してエラーがでてきます。

 

続いて、idにデータがない状態で値を入れてみます。すると

mysql> INSERT INTO my_tb_pkey VALUES(NULL,’山田美智子’);
ERROR 1048 (23000): Column ‘id’ cannot be null

となり、エラーが生じます。

 

以上のように主キーでは

  1. 重複
  2. NULL

が許されないことがわかります。

一意キー

続いて一意キーについて解説します。

 

一意キー(Unique Key)では、カラム内での重複はできませんが、NULLの入力は可能な値です。そして

CREATE TABLE テーブル名(カラム名 データ型 UNIQUE…);

により設定します。

 

では、さきほどと同様の構造のテーブルmy_tb_ukeyをつくってみます。すると

mysql> CREATE TABLE my_tb_ukey(id VARCHAR(10) UNIQUE,name VARCHAR(10));

となります。DESCでカラムを表示すると

mysql> DESC my_tb_ukey;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | varchar(10) | YES  | UNI | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

となります。idのKeyが「UNI」になっていることがわかります。これは一意キーであることを意味します。

また、idのNullはYesなので使えます。

 

では、値を入れていきます。

mysql> INSERT INTO my_tb_ukey VALUES('yamada','山田太郎');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO my_tb_ukey VALUES('yamada','山田美沙子');
ERROR 1062 (23000): Duplicate entry 'yamada' for key 'id'
mysql> INSERT INTO my_tb_ukey VALUES(NULL,'山田美沙子');
Query OK, 1 row affected (0.01 sec)

上記のように、重複は許さないが、NULLは入力できることがわかります。

一意キーはNULLが使用可、主キーはNULLを使用できない

 

以上で主キーと一意キーの解説を終わります。

著者:安井 真人(やすい まさと)