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 KEYWITHOUT ROWIDテーブルの主キーを除き、UNIQUE制約とPRIMARY KEY制約は通常UNIQUEインデックスで実装されます。次のスキーマは論理的に同等です。

  1. CREATE TABLE t1(a, b UNIQUE);

  2. CREATE TABLE t1(a, b PRIMARY KEY);

  3. CREATE TABLE t1(a, b);
    CREATE UNIQUE INDEX t1b ON t1(b);

PRIMARY KEY制約は1つのテーブルに1つしか設定できませんが、UNIQUE制約とUNIQUEインデックスは複数設定できます。動作は似ていますが設計上の意図が異なるため、目的に合う方法を選択してください。