プライマリーキーとユニークキーの違い

テーブルを作るときは大体プライマリーキーを設定してテーブルを作るんだけど、
そういえばユニークキーというのもあったよなと思って調べてみた。
何が違うんだろうか。

プライマリーキー

重複する値は保存できない。またnullは入れられない。
プライマリーキー制約
実際に見てみる。
まずはデータベースを選択して、
その後にテーブルを作る。

mysql> create table primarytest(id int not null primary key, name varchar(10));
Query OK, 0 rows affected (0.06 sec)

出来たか確認する。

mysql> show columns from primarytest;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.05 sec)

OKできてる。
idカラムにプライマリーキーを指定したので、
重複する値は扱えない。

mysql> insert into primarytest(id,name) values(1,'kenta');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

idが1の値はもう保存できない。
続いてnullを入れてみる。

mysql> insert into primarytest(id,name) values(null,'toshi');
ERROR 1048 (23000): Column 'id' cannot be null

nullはできない、と。

ユニークキー

重複する値は保存できない。けどnullは入れられる。
ユニークキー制約
先ほどと同じようにテーブルを作る。

mysql> create table uniquetest(id int unique,name varchar(10));
Query OK, 0 rows affected (0.04 sec)

プライマリーキーと同じで、
重複した値は保存できない。

mysql> insert into uniquetest(id,name) values(1,'namiko');
Query OK, 1 row affected (0.00 sec)

mysql> insert into uniquetest(id,name) values(1,'pinko');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'

nullを入れてみる。

mysql> insert into uniquetest(id,name) values(null,'nullko');
Query OK, 1 row affected (0.00 sec)

保存できた。
見てみる。

mysql> select * from uniquetest;
+------+--------+
| id   | name   |
+------+--------+
|    1 | namiko |
| NULL | nullko |
+------+--------+
2 rows in set (0.00 sec)

ちゃんとnullが保存されてる。
プライマリーキーとユニークキーの違いはnull値を保存できるかどうか。