UNIQUEインデックス

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

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

「CREATE」と「INDEX」の間に「UNIQUE」を記述します。

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

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

具体的には次のようになります。

create unique index nameindex on bookstable(name);

「bookstable」テーブルに含まれる「name」カラムを対象としたユニークな「nameindex」インデックスを作成します。

PRIMARY KEY制約

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

カラムに対してPRIMARY KEY制約を設定すると自動的にユニークインデックスが作成されます。

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

カラムに対してPRIMARY KEY制約を設定することと、カラムに対してインデックスを作成することは、実際には異なるのですが現状のSQLiteではあまり違いはありません。PRIMARY KEY制約はテーブルに一つしか設定できないのに対してインデックスは同じテーブルに対して複数のインデックスを作成することができるという違いはありますが、どちらの場合も対象のカラムにNULLを格納することもできますしカラムの値を変更することもできます。

サンプル

では実際にインデックスを作成してみます。

次のようなテーブルを対象にします。

p3-1

「name」カラムを対象としたユニークインデックスを作成します。

create unique index nameindex on goods(name);

p3-2

「SQL error: indexed columns are not unique」というエラーが発生しました。これはユニークインデックスの対象となるカラムに重複した値が含まれていたためです。

では次のように重複した値を持つデータを1行削除します。

p3-3

改めて「name」カラムを対象としたユニークインデックスを作成します。

p3-4

今度は無事にインデックスが作成されました。

ユニークインデックスが作成されたテーブルに新しいデータを追加する場合、ユニークインデックスの対象であるカラムには同じ値を格納できません。例えば次のようなデータを追加してみます。

p3-5

「SQL error: column name is not unique」というエラーが発生しデータを追加することができません。

なおユニークインデックスの対象のカラムにはNULLを格納することも可能です。また既に対象のカラムにNULLの値を持つデータがあっても、新たにNULLの値を持つデータを格納することが可能です。

p3-6