UNIQUEインデックスを作成する
インデックスの対象となるテーブルのカラムに格納されている値には重複した値が含まれていても構いませんが、重複した値を許可しないように設定することもできます。このようなインデックスをユニークインデックスと呼びます。ここでは SQLite におけるユニークインデックスの使い方について解説します。
(Last modified: )
UNIQUEインデックスの作成
UNIQUEインデックスを作成するための書式は次のとおりです。
CREATE UNIQUE INDEX インデックス名
ON テーブル名(カラム名1, カラム名2, ...);
対象となるカラムに重複した値が格納されているとユニークインデックスは作成することができません。またユニークインデックスを作成したあと、ユニークインデックスの対象となっているカラムに既に格納されている値を持つようなデータはテーブルに追加することができません。
複数のカラムの組み合わせに対してユニークインデックスを作成した場合には、それぞれのカラムの中では重複した値が含まれていても、指定した全てのカラムの値の組み合わせが重複していなければユニークインデックスを作成することができます。
それでは実際に試してみます。次のようなデータを持つテーブルの name カラムを対象にユニークインデックスを作成します。
name カラムにには現在重複した値が格納されていませんので name カラムを対象としたユニークインデックスを作成します。
create unique index nameindex on user(name);
ユニークインデックスが作成されました。
-- --
作成済みのユニークインデックスの対象となっているカラムには、すでに格納されているのと同じ値を持つデータを追加することはできません。例えば次のようなデータを追加しようとすると Error: UNIQUE constraint failed: user.name というエラーが発生します。
insert into user values('Suzuki', 18, 'Osaka');
ただしNULLだけはユニークインデックスが作成されているカラムであっても複数のデータで重複して格納することができます。
-- --
なお address カラムには重複した値が格納されています。このような重複した値を持つカラムを対象にユニークインデックスを作成しようとすると Error: UNIQUE constraint failed: user.address というエラーが発生します。
create unique index nameindex2 on user(address);
UNIQUEインデックスとテーブルのカラムに対するPRIMARY KEY制約/UNIQUE制約との関係
テーブルのカラムに対して PRIMARY KEY 制約や UNIQUE 制約を設定することができます。(制約については「テーブルの作成」を参照して下さい)。
カラムに対して PRIMARY KEY 制約や UNIQUE 制約を設定した場合の挙動は対象のカラムでUNIQUEインデックスを作成した場合と非常に似ており、SQLite の公式サイトにも次のような記述があります。
・SQLite Query Language: CREATE TABLE
In most cases, UNIQUE and PRIMARY KEY constraints are implemented by creating a unique index in the database. (The exceptions are INTEGER PRIMARY KEY and PRIMARY KEYs on WITHOUT ROWID tables.) Hence, the following schemas are logically equivalent:
CREATE TABLE t1(a, b UNIQUE);
CREATE TABLE t1(a, b PRIMARY KEY);
CREATE TABLE t1(a, b);
CREATE UNIQUE INDEX t1b ON t1(b);
ただ PRIMARY KEY 制約はテーブルに一つしか設定できないのに対して UNIQUE 制約や UNIQUE インデックスは同じテーブルで複数設定したり作成することができます。また挙動は似ていても設定する目的は異なりますので、適切な設定を行うようにして下さい。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。