SQLiteのUNIQUE 制約
【開発環境】
OS:Win10(64ビット)
データベース:SQLite3
コマンドプロンプト入力
【UNIQUE制約とは】
カラムに格納する値として既に格納されているデータの値と重複した値を禁止したい場合、カラムに UNIQUE 制約を設定する
Microsoft Windows [Version 10.0.18363.836]
(c) 2019 Microsoft Corporation. All rights reserved.
C:\Users\shyok>cd D:\pg\sqlite3
C:\Users\shyok>d:
D:\pg\sqlite3>sqlite3 D:\pg\sqlite3\myfriend.sqlite3
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite>
テーブル作成
sqlite> create table user(id integer unique, name text);
sqlite>
データ入力
sqlite> insert into user values(1, 'Honda');
sqlite> insert into user values(2, 'Moriyama');
sqlite> insert into user values(4, 'Kudou');
sqlite> .header on
sqlite> .mode column
sqlite>
sqlite> select * from user;
id name
---------- ----------
1 Honda
2 Moriyama
4 Kudou
次に UNIQUE制約が設定されている id カラムの値として既に格納済のデータと同じ値を設定したデータを追加してみます
sqlite>
sqlite> insert into user values(2, 'Suzuki');
Error: UNIQUE constraint failed: user.id←エラー
sqlite>
なお UNIQUE 制約が設定されていても NULL は重複して格納することが可能
sqlite> insert into user values(null, 'Okuda');
sqlite> insert into user values(null, 'Katayama');
sqlite>
sqlite> select * from user;
id name
---------- ----------
1 Honda
2 Moriyama
4 Kudou
Okuda
Katayama
sqlite>
【複数のカラムの組み合わせにUNIQUE制約を設定する】
UNIQUE 制約を単独のカラムだけではなく複数のカラムの組み合わせに UNIQUE 制約を設定することも可能です
sqlite> create table staff(no integer, unit text, name text, unique(no, unit));
sqlite> insert into staff values(1, 'Sales', 'Takahashi');
sqlite> insert into staff values(4, 'Dev', 'Suzuki');
sqlite> insert into staff values(2, 'Office', 'Endou');
sqlite> select * from staff;
no unit name
---------- ---------- ----------
1 Sales Takahashi
4 Dev Suzuki
2 Office Endou
sqlite>
次に no カラムの値だけ既存のデータと同じデータや、 unit カラムの値だけ既存のデータと同じデータを追加してみます
sqlite> insert into staff values(4, 'Design', 'Fukuda');
sqlite> insert into staff values(7, 'Sales', 'Noda');
sqlite> select * from staff;
no unit name
---------- ---------- ----------
1 Sales Takahashi
4 Dev Suzuki
2 Office Endou
4 Design Fukuda
7 Sales Noda
sqlite>
sqlite> insert into staff values(2, 'Office', 'Mori');
Error: UNIQUE constraint failed: staff.no, staff.unit
sqlite>
no カラムと unit カラムが UNIQUE制約に成っているためエラーに成る