ここでは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)