SQLite | テーブル | UNIQUE制約
UNIQUE制約を設定すると、カラムに重複した値が保存されるのを防げます。ここでは、UNIQUE制約の使い方を説明します。
UNIQUE制約とは
カラムにUNIQUE制約を設定すると、重複する値を保存できません。構文は次のとおりです。
CREATE TABLE テーブル名 (カラム名 UNIQUE, ...);
次のテーブルを作成します。idカラムにはUNIQUE制約が設定されています。
create table user (id integer unique, name text);
sqlite> create table user (id integer unique, name text);
sqlite>
いくつかの行を追加します。
insert into user values (1, 'devkuma');
insert into user values (2, 'kimkc');
insert into user values (4, 'araikuma');
sqlite> insert into user values (1, 'devkuma');
sqlite> insert into user values (2, 'kimkc');
sqlite> insert into user values (4, 'araikuma');
sqlite>
既存の行と同じidを追加すると、Error: UNIQUE constraint failed: user.idと表示されます。
insert into user values (2, 'happykuma');
sqlite> insert into user values (2, 'happykuma');
Error: UNIQUE constraint failed: user.id
sqlite>
この制約により、カラムへの重複値の保存を防げます。
ただし、UNIQUE制約があっても複数のNULL値は保存できます。
insert into user values (null, 'mykuma');
insert into user values (null, 'yourkuma');
sqlite> insert into user values (null, 'mykuma');
sqlite> insert into user values (null, 'yourkuma');
sqlite>
NULLを許可しない場合は、NOT NULL制約も設定します。
複数カラムの組み合わせにUNIQUE制約を設定する
UNIQUE制約は、複数カラムの組み合わせにも設定できます。構文は次のとおりです。
CREATE TABLE テーブル名 (カラム名1, カラム名2, ... , UNIQUE (カラム名1, カラム名2, ...));
2つのカラムに制約を設定した場合、各カラム単独の重複は許可されますが、同じ値の組み合わせは保存できません。
noとunitの組み合わせにUNIQUE制約を設定したテーブルを作成します。
create table employee (no integer, unit text, name text, unique (no, unit));
sqlite> create table employee (no integer, unit text, name text, unique (no, unit));
sqlite>
いくつかの行を追加します。
insert into employee values (1, 'Sales', 'devkuma');
insert into employee values (4, 'Dev', 'kimkc');
insert into employee values (2, 'Office', 'araikuma');
sqlite> insert into employee values (1, 'Sales', 'devkuma');
sqlite> insert into employee values (4, 'Dev', 'kimkc');
sqlite> insert into employee values (2, 'Office', 'araikuma');
sqlite>
noだけ、またはunitだけが既存行と同じ行を追加します。組み合わせ全体は異なるため、エラーになりません。
insert into employee values (4, 'Design', 'mykuma');
insert into employee values (7, 'Sales', 'yourkuma');
sqlite> insert into employee values (4, 'Design', 'mykuma');
sqlite> insert into employee values (7, 'Sales', 'yourkuma');
sqlite>
既存行と同じnoとunitの組み合わせを追加すると、Error: UNIQUE constraint failed: employee.no, employee.unitと表示されます。
insert into employee values (2, 'Office', 'blackkuma');
sqlite> insert into employee values (2, 'Office', 'blackkuma');
Error: UNIQUE constraint failed: employee.no, employee.unit
sqlite>
このように、単一カラムだけでなく複数カラムの組み合わせにもUNIQUE制約を設定できます。