SQLiteを学んでいこうという連載の13回目です。前回の記事はこちらになります。
前回は、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制約および、その他の制約機能についてご紹介します。お楽しみに!!