auの日記

プログラミング初心者の日記。(auはハンドルネームです)

SQLite3でのUNIQUE制約

auです。
UNIQUEインデックスより先に、テーブルを作成する際にプライマリーキーのように指定できるUNIQUE制約について書くべきでした。

UNIQUE制約について

UNIQUE制約とは、すでに格納してあるデータを重複を禁止する場合にカラムにUNIQUE制約を設定します。
使い方はPRIMARY KEYと同じです。

CREATE TABLE テーブル名(カラム名 UNIQUE, カラム名2...);

実際に作成してみます。

 CREATE TABLE user(id integer unique, name, address);

今回追加するデータは3つです。

INSERT INTO user VALUES(1,'Sato', '東京');
INSERT INTO user VALUES(2,'Suzuki', '神奈川');
INSERT INTO user VALUES(3,'Takahashi', '埼玉');

idが重複するデータを追加してみます。

INSERT INTO user VALUES(3,'Kobayashi', '栃木');
Error: UNIQUE constraint failed: user.id

UNIQUE制約がかかっているので追加できないです。
idの値をNULLにすると、重複するデータを追加することができます。

INSERT INTO user VALUES(NULL,'Saito', '栃木');
INSERT INTO user VALUES(NULL,'Kitamura', '群馬');
sqlite>

NOT NULL制約をすることで、NULLも重複して追加できないように設定することもできます。

複数のカラムをUNIQUE制約に設定する

複数のカラムをUNIQUE制約にする場合は以下のようにします。

CREATE TABLE テーブル名(カラム名1, カラム名2..., UNIQUE(カラム名1, カラム名2...)); 

実際に作成してみます。

CREATE TABLE staff(id integer, name text, address text, UNIQUE(id, name));

idとnameがUNIQUE制約されたテーブルを作成しました。
データを追加していきます。

INSERT INTO staff VALUES(1,'Sato', '東京');
INSERT INTO staff VALUES(2,'Suzuki', '神奈川');
INSERT INTO staff VALUES(3,'Takahashi', '埼玉');
INSERT INTO staff VALUES(3,'Kobayashi', '栃木');
INSERT INTO staff VALUES(2,'Suzuki', '群馬');
Error: UNIQUE constraint failed: staff.id, staff.name

idだけの重複だとエラーが起きないのに対して、idとnameの両方が重複したデータはエラーが起きます。