UNIQUEインデックス

広告

インデックスの対象となるカラムに格納されている値には重複した値が含まれていても構いませんが、重複した値を許可しないように設定することもできます。このようなインデックスをユニークインデックスと呼びます。ここではユニークインデックスの使い方について解説します。

1.UNIQUEインデックスの作成
2.UNIQUEインデックスとPRIMARY KEY制約/UNIQUE制約

書式は次の通りです。

CREATE UNIQUE INDEX インデックス名
 ON テーブル名(カラム名1, カラム名2, ...);

対象となるカラムに重複した値が格納されているとユニークインデックスは作成することができません。またユニークインデックスの対象となっているカラムに既に格納されている値を持つようなデータはテーブルに追加することができません。

なおインデックスの対象となるカラムに複数のカラムを指定した場合には、それぞれのカラムの中では重複した値が含まれていても、指定した全てのカラムの値の組み合わせが重複していなければユニークインデックスを作成することができます。

それでは実際に試してみます。次のようなデータを持つテーブルを対象にユニークインデックスを作成します。

p3-1

「name」カラムには現在重複した値が格納されていませんので「name」カラムを対象としたユニークインデックスを作成します。

create unique index nameindex on user(name);

p3-2

上記のように表示されればユニークインデックスの作成は完了しています。

なお重複した値が可能されている「address」カラムを対象としたユニークインデックスを作成しようとすると「Error: UNIQUE constraint failed: user.address」というエラーが表示されます。

p3-3

データを追加する時、ユニークインデックスが作成されている「name」カラムの値として既に格納済の値と同じ値を指定した場合も「Error: UNIQUE constraint failed: user.name」というエラーが表示されます。

p3-4

ただしNULLだけはユニークインデックスが作成されているカラムであっても複数のデータで重複して格納することができます。

p3-5

カラムに対してPRIMARY KEY制約やUNIQUE制約を設定することができます。(制約については「テーブルの作成」を参照して下さい)。

create table product(id integer primary key, name text);
create table product(id integer unique, name text);

カラムに対してPRIMARY KEY制約やUNIQUE制約を設定した場合の挙動は対象のカラムでUNIQUEインデックスを作成した場合と非常に似ており、SQLiteの公式サイトにも「In most cases, UNIQUE and PRIMARY KEY constraints are implemented by creating a unique index in the database. 」と記載があります。

ただPRIMARY KEY制約はテーブルに一つしか設定できないのに対してUNIQUE制約やUNIQUEインデックスは同じテーブルで複数設定したり作成することができます。また挙動は似ていても設定する目的は異なりますので、適切な設定を行うようにして下さい。

( Written by Tatsuo Ikura )