【MySQL】ユニークキーを作成する方法


ここではMySQLで、ユニークキーを作成する方法を紹介しています。

主キーの設定や確認方法は↓で紹介していますので参考にしてください。
>>【MySQL】主キー/プライマリーキーを設定/追加/削除する方法
>>【MySQL】主キー/プライマリーキーを確認する方法

ユニークキーとは

ユニークキーを作成したカラムには、一意の値のみが登録できるようになります。同じ値、重複する値は登録できなくなります。

ユニークキーを作成する方法

テーブル作成時にユニークキーを作成する

テーブルを作成するときにユニークキーを作成する場合はCREATE TABLE文でUNIQUEキーを作成することが出来ます。

CREATE TABLE テーブル名(
 カラム名 データ型
 [,カラム名 データ型]
 ,UNIQUE ユニークキー名(カラム名)
);

上記のSQL以外にも次のように書くことが出来ます。

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

既存のテーブルにユニークキーを作成する

既に存在するテーブルにユニークキーを作成する場合はCREATE INDEX文で作成します。

CREATE UNIQUE INDEX ユニークキー名 ON テーブル名(カラム名);

ユニークキーを作成するSQLサンプル

ユニークキーを実際に作成してみます。

まずは次のようなテーブルを用意してデータを登録しておきました。

mysql> desc tab1;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| emp_id   | varchar(10)  | YES  |     | NULL    |       |
| emp_name | varchar(100) | YES  |     | NULL    |       |
| dept     | varchar(10)  | YES  |     | NULL    |       |
| age      | int(11)      | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.01 sec)

続いて「CREATE UNIQUE INDEX文」でユニークキーをemp_id列に作成しました。

mysql> CREATE UNIQUE INDEX idx01 ON tab1(emp_id);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

続いてemp_id列に既に存在する値「00001」のレコードをINSERTを試みましたがエラーになりました。

emp_id列の値を「00007」としてINSERT文を実行すると登録できました。

mysql> INSERT INTO tab1 VALUES('00001','Suzuki','HR',28);
ERROR 1062 (23000): Duplicate entry '00001' for key 'idx01'

mysql> INSERT INTO tab1 VALUES('00007','Suzuki','HR',28);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
| 00007  | Suzuki   | HR    |   28 |
+--------+----------+-------+------+
7 rows in set (0.00 sec)