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の両方が重複したデータはエラーが起きます。