MySQL,UNIQUEで重複を禁じるユニークキーを設定する

スポンサーリンク

鍛錬 894

MySQL,UNIQUEで重複を禁じるユニークキーを設定する

テーブルを作成する際に、データの重複を禁じるためのユニークキーを設定するには、UNIQUE を使用します。

主キー(primary key) とは異なり、ユニークキーを設定したカラムへ NULL を格納することができます。

関連記事:MySQL,PRIMARY KEYで主キーを設定する
 
使用方法は、以下に示す通りです。

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

 
ユニークキーを設定されたカラムには、インデックス(INDEX) が自動的に設定されます。

ユニークキーを設定されたカラムは、以下の制約が発生します。

  • 値の重複ができない
 
スポンサーリンク

実行結果

以下は、テーブルを作成する際にユニークキーを設定しています。

テーブルを作成

今回は、テーブル「lang」を作成する際に、カラム「id」にユニークキーを設定しています。

作成するテーブル

カラム(1列目) カラム(2列目)
id
(ユニークキー)
type
mysql> 
mysql> create table lang (id int unique, type varchar(256));
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> 
mysql> show columns from lang;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  | UNI | NULL    |       |
| type  | varchar(256) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

 
上記に示した通り、テーブルの構造を確認すると、カラム「id」の項目「Key」が「UNI」となっていることが分かります。

インデックス(INDEX) が設定されたことを確認

以下は、作成したテーブル lang にインデックスが自動的に設定されていることを、SHOW INDEX を使用して確認しています。

mysql> 
mysql> show index from lang \G
*************************** 1. row ***************************
        Table: lang
   Non_unique: 0
     Key_name: id
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

 
上記に示した通り、インデックスの名前が表示される「Key_name」の項目が「id」となっており、インデックスが設定されていることが分かります。

重複したデータを追加

以下は、テーブル「lang」にデータを追加する際、ユニークキーを設定したカラム「id」に重複するデータを指定しています。

データを追加する前のテーブル

id
(ユニークキー)
type
1 C

 
2行目にデータの追加を試みる

id
(ユニークキー)
type
1 C
1 Assembly
mysql> 
mysql> select * from lang;
+------+------+
| id   | type |
+------+------+
|    1 | C    |
+------+------+
1 row in set (0.00 sec)

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

 
上記に示した通り、カラム「id」はユニークキーを設定しているため、重複した値「1」を追加しようするとエラーとなりました。

NULL を追加

以下は、テーブル「lang」にデータを追加する際、ユニークキーを設定しているカラム「id」に「NULL」を指定しています。

データを追加する前のテーブル

id
(ユニークキー)
type
1 C

 
2行目にデータの追加を試みる

id
(ユニークキー)
type
1 C
NULL Assembly
mysql> 
mysql> select * from lang;
+------+------+
| id   | type |
+------+------+
|    1 | C    |
+------+------+
1 row in set (0.00 sec)

mysql> 
mysql> 
mysql> insert into lang values (NULL, 'Assembly');
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> 
mysql> select * from lang;
+------+----------+
| id   | type     |
+------+----------+
|    1 | C        |
| NULL | Assembly |
+------+----------+
2 rows in set (0.00 sec)

 
上記に示した通り、ユニークキーに設定したカラムでは「NULL」を格納することが禁じられていないため、カラム「id」に「NULL」を格納することができました。

スポンサーリンク

シェアする

フォローする