MySQL カラムの組み合わせでUNIQUE属性を付与する

MySQLテーブルに複数カラムの組み合わせでユニーク属性を付与する方法について。設定したいと思う度に構文を忘れてググる事が多いので、備忘録として書き留めたいと思います。

UNIQUE属性の設定

カラムに対してユニーク属性を設定すると、そのカラムに対して値の重複が禁止されます。

<id>  <name(unique)>
 1     apple
 2     grape
 3     strawberry
 4     pineapple
 5     NULL
 6     kiwi

new    apple   <- 挿入できない
new    NULL    <- 挿入可

ただし、NULL値については重複とみなさないので、nameをNULLとした新たな行の挿入は可能です。以下のような構文で既存のテーブルにunique属性を付与できます。

ALTER TABLE table_name ADD UNIQUE key_name (column_name);

設定するUNIQUEキーに対して、key_nameで名前をつける事ができます。省略も可能です。省略した場合、カラム名がkey_nameとなります。

設定したいカラムにすでに重複のあるテーブルに対して、上記構文で制約を付与するとエラーとなります。

複数カラムの組に対してのUNIQUE制約

unique属性は複数カラムの組み合わせに対してセットすることもできます。

<id>  <name>  <production_area>   (name - production_areaの組みに対するUNIQUE)
 1      apple   japan
 2      apple   united_states
 3      apple   china
 4      apple   NULL
 5      NULL    japan

new     apple   japan  <- 挿入不可 (apple-japanの組み有り)
new     apple   france <- 挿入可 (appleは既に存在するが、apple-franceの組み合わせは無い)
new     grape   japan  <- 挿入可
new     NULL    japan  <- 挿入可 (既にNULL-japanの組は存在するが、NULLは重複とみなされない)

組み合わせにNULLを含む場合は重複とみなされません(上記NULL-japanの組)。カラムの組み合わせunique属性は、以下のようにカッコ内に複数のカラムを指定します。

ALTER TABLE table_name ADD UNIQUE key_name (column_name1, column_name2, ...);

key_nameを省略した場合、最初に指定したカラム名がkey_nameとなります。

設定したUNIQUE属性を確認する

インデックスを表示する以下の構文で、設定したUNIQUE属性を確認することができます。

SHOW INDEX FROM table_name;

設定したUNIQUEインデックスを削除

既に存在するUNIQUEインデックスを削除するには以下の構文を使用します。

ALTER TABLE table_name DROP INDEX key_name;

key_nameにはUNIQUEインデックス設定時に指定したkey_nameを渡します。key_nameが不明な場合は1つ前の「設定したUNIQUE属性を確認する」構文で確認できます。