制約_2(SQLiteを学ぶ_13)

SQLiteを学んでいこうという連載の13回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、SQLiteの制約機能についてご紹介しました。今回も引き続き制約機能について説明します。

PRIMARY KEY制約

データベース用語の中に主キー(PRIMARY KEY)なるものがあります。主キーはテーブル内のレコードを特定するためのもので、特定の列を主キーとして設定することでテーブル内のレコードを個別に識別できます。SQLiteでは、テーブル内のPRIMARY KEY制約を設定した列が主キーとなります。 PRIMARY KEY制約はテーブル作成時に以下の指定をすると設定できます。

CREATE TABLE テーブル名(列名 データ型 PRIMARY KEY);

PRIMARY KEY制約を設定してテーブルを作って動きを見てみましょう。

sqlite> CREATE TABLE sample(id INTEGER,name TEXT PRIMARY KEY,age INTEGER);
sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);
sqlite> INSERT INTO sample VALUES(2,"TANAKA",30);
Runtime error: UNIQUE constraint failed: sample.name (19)

最初のデータと2番目のデータのname列が同じ「TANAKA」となっているため、2番目のデータは登録できません。でもこれって前回ご紹介したUNIQUE制約と同じですよね。いったい何が違うのでしょうか。

まず用途なのですが、最初に説明した通りPRIMARY KEY制約はテーブル内のレコードを特定するための列に設定するものです。対してUNIQUE制約は特定列のデータの二重登録を防ぎたい列に設定するものです。したがってPRIMARY KEY制約はテーブル内の複数の列に設定できません。試しに複数登録してみましょう。

sqlite> CREATE TABLE sample(id INTEGER,name TEXT PRIMARY KEY,age INTEGER PRIMARY KEY);
Parse error: table "sample" has more than one primary key

エラーが発生してテーブルを作成できませんでした。UNIQUE制約についても複数の列について登録してみましょう。

sqlite> CREATE TABLE sample(id INTEGER,name TEXT UNIQUE,age INTEGER UNIQUE);
sqlite>

コチラは問題なくテーブル作成できました。

複数列の組み合わせによる設定

PRIMARY KEY制約を複数の列に設定することはできませんが、複数列の組み合わせで設定することは可能です。この設定をすると、同じ組み合わせのレコードを2重に登録することはできくなります。複数列の組み合わせでの設定は、テーブル作成時に以下の指定をすると設定できます。

CREATE TABLE テーブル名(列名1,列名2,列名3,・・・, PRIMARY KEY(列名1,列名2,列名3,・・・));

複数の列にPRIMARY KEY制約を設定してテーブルを作って動きを見てみましょう。

sqlite> CREATE TABLE sample(id INTEGER,name TEXT,age INTEGER,PRIMARY KEY(name,age));
sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);
sqlite> INSERT INTO sample VALUES(2,"TANAKA",30);
sqlite> INSERT INTO sample VALUES(3,"YAMADA",25);
sqlite> INSERT INTO sample VALUES(4,"TANAKA",25);
Runtime error: UNIQUE constraint failed: sample.name, sample.age (19)
sqlite> SELECT * FROM sample;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'TANAKA' │ 30  │
│ 3  │ 'YAMADA' │ 25  │
└────┴──────────┴─────┘

name列のデータ、age列のデータそれぞれが個別に重複しているレコードは登録できますが、両方とも重複しているレコードは登録できません。

次回も制約

いかがでしょうか。今回はPRIMARY KEY制約についてご紹介しました。主キーの設定はリレーショナルデータベースで重要な概念になります。次回もPRIMARY KEY制約および、その他の制約機能についてご紹介します。お楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから