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つのカラムに制約を設定した場合、各カラム単独の重複は許可されますが、同じ値の組み合わせは保存できません。

nounitの組み合わせに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> 

既存行と同じnounitの組み合わせを追加すると、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制約を設定できます。