SQLite | インデックス | UNIQUEインデックスを作成する
通常のインデックスには重複する値を含められますが、UNIQUEインデックスは対象列の重複を禁止します。ここでは、UNIQUEインデックスの使い方を説明します。
UNIQUEインデックスの作成
構文は次のとおりです。
CREATE UNIQUE INDEX インデックス名 ON テーブル名 (列名1, 列名2, ...);
対象列に重複する値があると、UNIQUEインデックスは作成できません。作成後は、既存のインデックス値と重複する行を追加できません。
複数列のインデックスでは、個々の列に重複があっても、対象列全体の値の組み合わせが一意であれば作成できます。
例で使用するテーブルを作成します。
create table user (name text, old integer, address text);
sqlite> create table user (name text, old integer, address text);
sqlite>
次のデータを追加します。
insert into user values ('devkuma', 28, 'Seoul');
insert into user values ('kimkc', 22, 'Busan');
insert into user values ('araikuma', 32, 'Seoul');
insert into user values ('happykuma', 23, 'Seoul');
sqlite> insert into user values ('devkuma', 28, 'Seoul');
sqlite> insert into user values ('kimkc', 22, 'Busan');
sqlite> insert into user values ('araikuma', 32, 'Seoul');
sqlite> insert into user values ('happykuma', 23, 'Seoul');
sqlite>
name列には現在重複がないため、UNIQUEインデックスを作成できます。
create unique index nameindex on user (name);
sqlite> create unique index nameindex on user (name);
sqlite>
UNIQUEインデックスが作成されました。
–
既存のインデックス値と重複する値は追加できません。次の文はdevkumaが既に存在するためエラーになります。
insert into user values ('devkuma', 18, 'Busan');
sqlite> insert into user values ('devkuma', 18, 'Busan');
Error: UNIQUE constraint failed: user.name
sqlite>
UNIQUEインデックスの対象列には複数のNULL値を保存できます。
–
address列には重複する値があるため、その列にUNIQUEインデックスを作成するとエラーになります。
create unique index nameindex2 on user (address);
sqlite> create unique index nameindex2 on user (address);
Error: UNIQUE constraint failed: user.address
sqlite>
PRIMARY KEY制約およびUNIQUE制約との関係
テーブルの列にPRIMARY KEY制約やUNIQUE制約を設定できます。
これらの制約はUNIQUEインデックスと同様に動作します。SQLiteの公式ドキュメントによると、INTEGER PRIMARY KEYとWITHOUT ROWIDテーブルの主キーを除き、UNIQUE制約とPRIMARY KEY制約は通常UNIQUEインデックスで実装されます。次のスキーマは論理的に同等です。
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制約は1つのテーブルに1つしか設定できませんが、UNIQUE制約とUNIQUEインデックスは複数設定できます。動作は似ていますが設計上の意図が異なるため、目的に合う方法を選択してください。