一意キー(UNIQUE key)制約とは、一意の列値(Unique Column Value)に関するルールであり、特定の列または列ファミリーに定義されます。その役割は、挿入または更新されるデータ行の列または列ファミリーの値が一意であることを保証し、テーブル内の任意の2行の特定の列または列セットの値が重複しないようにすることです。
本記事では、以下の具体的な例を通じて一意性制約の主な特性を紹介します。
obclient> CREATE TABLE t1(c1 INT, c2 INT, CONSTRAINT t1_uk_c1_c2 UNIQUE(c1, c2));
Query OK, 0 rows affected
obclient> INSERT INTO t1 VALUES(1, 1);
Query OK, 1 row affected
obclient> INSERT INTO t1 VALUES(1, 1);
OBE-00001: unique constraint '1-1' for key 'T1_UK_C1_C2' violated
obclient> INSERT INTO t1 VALUES(null, 1);
Query OK, 1 row affected
obclient> INSERT INTO t1 VALUES(null, 1);
Query OK, 1 row affected
obclient> INSERT INTO t1 VALUES(null, null);
Query OK, 1 row affected
obclient> INSERT INTO t1 VALUES(null, null);
Query OK, 1 row affected
また、次の図のように、dept テーブルの dname 列に UNIQUE キー制約を定義した場合、このテーブルに重複する部門名を持つ行を存在させることは許可されませんが、ユーザーは dname 列にNULL値を挿入することができます。もし dname 列に NOT NULL 制約も定義されている場合、ユーザーは dname 列にNULL値を挿入することができません。

UNIQUE キーが複数の列で構成されている場合、このデータ列グループは複合一意キー(Composite Unique Key)と呼ばれます。次の図のように、customer テーブルに定義された UNIQUE キー制約は複合一意キーを使用しており、area と phone の2列を含みます。これは、任意の2行のキー値が重複してはならないことを要求します。ユーザーは列にNULL値を入力することができます。ただし、列に NOT NULL 制約も定義されている場合、NULL値の入力は許可されません。
ユーザーは customer テーブルに任意のレコードを挿入できますが、上記の UNIQUE キー制約の制限に基づき、テーブル内の各行のエリアコード(Area Code)と電話番号(Telephone Number)の組み合わせは重複してはなりません。これにより、不注意による電話番号の重複問題を回避できます。
