【プログラミング】SQLite3:PRIMARY KEYとUNIQUE

  • URLをコピーしました!
目次

SQLite3

前回、データベース管理システムSQLite3のデータの更新と削除、テーブル名の変更とテーブルの削除を勉強してみました。

今回は次回、重複したデータの取り扱いを学ぶための前段階として「PRIMARY KEY」と「UNIQUE」に関して勉強していきます。

なぜ「PRIMARY KEY」や「UNIQUE」を先に学ばなければいけないかというと、これらのキーが重複を許さないキーであるため、新しく追加されるデータが重複しているかどうかを判定するキーとなるためです。

ということでまずは今回使用するデータベースの作成を行います。

ターミナルを立ち上げ、こちらのコマンドを実行し、データベースの作成を行います。

sqlite3 test5.db
sqlite> .databases

PRIMARY KEYの設定

まずPRIMARY KEYの設定ですが、これは前にもやりましたが「CREATE TABLE テーブル名(列名1 データ型 PRIMARY KEY)」のように列名、データ型の後ろに「PRIMARY KEY」を追加します。

このPRIMARY KEYをもつデータの挙動を試してみましょう。

まずIDをPRIMARY KEYとするテーブルを作成し、データを追加します。

sqlite> CREATE TABLE table1(id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
sqlite> INSERT INTO table1(id, name, age) values(1, 'Sato', 10);
sqlite> SELECT * FROM table1;

実行結果
1|Sato|10

このテーブルに同じidをもつが、nameとageは違う値をもつデータを追加しようとしてみます。

sqlite> INSERT INTO table1(id, name, age) values(1, 'Suzuki', 15);

実行結果
Error: stepping, UNIQUE constraint failed: table1.id (19)

データを追加できず、エラーとなってしまいました。

これはidがPRIMARY KEYとして設定されているため、重複が許されないためです。

次にidは違う値をもつが、nameとageは同じ値をもつデータを追加してみましょう。

sqlite> INSERT INTO table1(id, name, age) values(2, 'Sato', 10);
sqlite> SELECT * FROM table1;

実行結果
1|Sato|10
2|Sato|10

今度は問題なく追加されました。

このテーブルではidのみがPRIMARY KEYとして重複が許されていないだけで、他の列に関しては重複の制限がないため、このデータは問題なく追加することができるというわけです。

複数のPRIMARY KEYを設定

次に複数のPRIMARY KEYを設定して、その挙動を確かめてみましょう。

複数の列にPRIMARY KEYを設定するには、CREATE TABLE テーブル名(列名1 データ型, 列名2 データ型, 列名3 データ型, … PRIMARY KEY(列名1, 列名2, …))」のように記述します。

今回は「id」と「name」をPRIMARY KEYとしてみましょう。

CREATE TABLE table2(id INTEGER, name TEXT, age INTEGER, PRIMARY KEY(id, name));
sqlite> INSERT INTO table2(id, name, age) values(1, 'Sato', 10);
sqlite> SELECT * FROM table2;

実行結果
1|Sato|10

それではこのテーブルにidもnameも重複するデータ(idが1でnameがSato、ageが15)を追加してみます。

sqlite> INSERT INTO table2(id, name, age) values(1, 'Sato', 15);

実行結果
Error: stepping, UNIQUE constraint failed: table2.id, table2.name (19)

エラーとなり追加できませんでした。

次にidだけ重複するデータ(idが1、nameがSuzuki、ageが15)を追加してみます。

sqlite> INSERT INTO table2(id, name, age) values(1, 'Suzuki', 15);
sqlite> SELECT * FROM table2;

実行結果
1|Sato|10
1|Suzuki|15

追加できました。

さらにnameだけ重複するデータ(idが2、nameがSato、ageが15)を追加してみます。

sqlite> INSERT INTO table2(id, name, age) values(2, 'Sato', 15);
sqlite> SELECT * FROM table2;

実行結果
1|Sato|10
1|Suzuki|15
2|Sato|15

こちらも追加されました。

これらのことからPRIMARY KEYに複数の列を設定した場合はそれら全てを満たした場合を重複する、つまり「AND」の条件のみを重複すると判断することが分かりました。

ではこのPRIMARY KEYを複数設定して「OR」の条件にするにはどうしたらいいのでしょうか?

とりあえず最初の書き方で複数のPRIMARY KEYが設定できるか試してみましょう。

sqlite> CREATE TABLE table3(id INTEGER PRIMARY KEY, name TEXT PRIMARY KEY, age INTEGER);

実行結果
Error: in prepare, table "table3" has more than one primary key (1)

二つ以上のPRIMARY KEYがあるというエラーが出てしまいました。

つまりPRIMARY KEYは一つ(複数の場合はAND)だけしか設定できないということです。

UNIQUEの設定

ではORの条件は設定できないのでしょうか?

そのために複数設定できるUNIQUEというものがあるようです。

idをPRIMARY KEY、nameをUNIQUEにしてテーブルを作成してみましょう。

sqlite> CREATE TABLE table3(id INTEGER PRIMARY KEY, name TEXT UNIQUE, age INTEGER);
sqlite> INSERT INTO table3(id, name, age) values(1, 'Sato', 10);
sqlite> SELECT * FROM table3;

実行結果
1|Sato|10

PRIMARY KEYが同じだと重複とみなされ、データを追加できないのは先の検討で分かっています。

ということでnameだけが重複するデータ(idが2、nameがSato、ageが15)を追加してみましょう。

sqlite> INSERT INTO table3(id, name, age) values(2, 'Sato', 15);

実行結果
Error: stepping, UNIQUE constraint failed: table3.name (19)

今度はnameだけが重複している状態でもエラーとなり追加できませんでした。

このようにUNIQUEを使うと複数の列において、列ごとにデータの重複を許す、許さないが設定できるようになります。

次回はこのPRIMARY KEYやUNIQUEを使って、重複したデータの取り扱い、つまりは重複した場合は何もしない、もしくはデータをアップデートする、そして重複しない場合にはデータを追加するという動作を試してみたいと思います。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次