PRIMARY KEY制約の使い方
SQLite で利用可能制約の 1 つである PRIMARY KEY 制約の使い方について解説します。カラムに PRIMARY KEY 制約を設定した場合、そのカラムが主キーであることを示します。
(Last modified: )
PRIMARY KEY制約とは
カラムに PRIMARY KEY 制約を設定すると、そのカラムが主キー(プライマリーキー)であることをあらわします。主キーは1つまたは複数のカラムの組み合わせに対して設定し、テーブルの中で1つだけ存在します。主キーが設定されたカラムでは他のデータと重複する値を取ることはできません。
カラムに対して PRIMARY KEY 制約を設定するには次のように記述します。
CREATE TABLE テーブル名(カラム名 PRIMARY KEY, ...);
また複数のカラムの組み合わせに対して PRIMARY KEY 制約を設定するには次のように記述します。
CREATE TABLE テーブル名(カラム名1, カラム名2, ... ,
PRIMARY KEY(カラム名1, カラム名2, ...));
PRIMARY KEY 制約が設定されたカラムには重複した値を格納することはできません。ただし SQLite では null は複数のカラムに格納が可能です。複数のカラムを組み合わせたものに PRIMARY KEY 制約が設定されている場合は、複数のカラムに格納された値と同じ組み合わせの値を格納することはできません。
-- --
それでは実際に試してみます。次のようなテーブルを作成し、 id カラムに対して PRIMARY KEY 制約を設定しました。
create table user(id int primary key, name text);
PRIMARY KEY 制約を設定して id カラムには重複した値を格納することができません。既に他のデータで格納されているのと同じ値を持つデータを追加しようとすると Error: UNIQUE constraint failed: user.id と表示されます。
ではテーブルに 3 つのデータを順に追加してみます。
insert into user values(1, 'Yamada');
insert into user values(2, 'Tanaka');
insert into user values(1, 'Honda');
3 つ目のデータが id カラムの値が既存のデータと重複しているためエラーとなりました。
このように PRIMARY KEY 制約が設定されたカラムにはすでに存在するデータと同じ値を持つデータを追加することはできません。
INTEGER型のカラムにPRIMARY KEY制約を設定する場合
データ型が INTEGER のカラムに対して PRIMARY KEY 制約を設定した場合、新しいデータを追加する時に対象のカラムの値を省略すると、 AUTOINCREMENT 制約を設定した時と同じように自動的に数値が格納されます。
CREATE TABLE テーブル名(カラム名 INTEGER PRIMARY KEY, ...);
カラムに格納される値は、対象のカラムに現在格納されている最大の値に 1 を加えた値となります。
カラムのデータ型は INT が含まれる場合、全て INTEGER 型となりますが、連番が自動的に割り振られるのはカラムに対して INTEGER PRIMARY KEY と記述した場合だけです。 INT PRIMARY KEY ではこのような特別な動作はしません。
実際に試してみます。次のようなテーブルを作成しました。INTEGER 型の id カラムに PRIMARY KEY 制約を設定しています。
create table user(id integer primary key, name text);
それでは id カラムには値を指定せずにデータをいくつか追加してみます。その後でデータを取得します。
insert into user(name) values('Andou'); insert into user(name) values('Honda'); insert into user(name) values('Yamashita');
select * from user;
id カラムに順番に数値が自動で格納されていることが確認できます。
値を省略せずに PRIMARY KEY 制約が設定されたカラムに任意の数値を格納することもできます。ただし PRIMARY KEY 制約が設定されていますので重複する値は格納できません。
id カラムに値を指定して次のようなデータを追加しました。追加したあとにデータを取得してみると、 id カラムに値を指定した場合は、その値が格納されていることが確認できます。
insert into user values(8, 'Kanemoto');
次に PRIMARY KEY 制約が設定されたカラムに値を指定せずにデータを追加すると、 PRIMARY KEY 制約が設定されてカラムに格納されている最大の値が 8 ですので、追加される値は 9 となります。
insert into user(name) values('Tokuda');
-- --
なお PRIMARY KEY 制約が設定されたカラムには同じ値を重複して格納することはできませんが、データを削除するとそのデータのカラムに格納されていた値は、別のデータを追加する時に指定することができます。
例えば現在 PRIMARY KEY 制約が設定されたカラムに格納されている値が 3 のデータを削除したあと、新しいデータとして PRIMARY KEY 制約が設定されたカラムに 3 を指定してデータを追加することができます。
それでは id カラムの値が 3 のデータを削除します。
delete from user where id = 3;
id カラムの値に 3 を指定してデータを追加します。
insert into user values(3, 'Wada');
問題なくデータを追加することができました。
このように PRIMARY KEY 制約が設定されたカラムには重複する値を格納することはできませんが、いったん削除してしまえば別のデータを追加するときに削除したものと同じ値をカラムに格納することができます。
PRIMARY KEY制約を設定したカラムに別のデータ型の値を挿入した場合
SQLite ではテーブル作成時にカラムにデータ型を指定した場合でも、他のデータ型を格納してもエラーにはなりません。例えば INTEGER 型を設定したカラムに対して TEXT 型の値を格納する事も可能です。
次のようなテーブルを作成しました。
create table user(id integer, name);
id カラムの値に整数ではなく文字列を指定してデータを追加してみます。
insert into user values('First', 'Shibata');
特にエラーも出ず、データを追加することができました。
これに対してカラムに対してデータ型として INTEGER を指定し、 PRIMARY KEY 制約を設定した場合はこのカラムには整数または自動で整数に変換される値しか格納することはできなくなります。
次のようなテーブルを作成しました。
create table user(id integer primary key, name);
id カラムの値に整数ではなく文字列を指定してデータを追加してみます。
insert into user values(2, 'Nishi');
insert into user values('5', 'Matsumoto');
insert into user values('Seven', 'Tadokoro');
INTEGER PRIMARY KEY が指定されているカラムに対し、数値の 10 や、TEXT型の値であっても '5' のような値であれば自動的に INTEGER 型の 5 に自動で変換されるためデータを追加することができますが、 'Seven' のような TEXT 型の値を格納しようとすると Error: datatype mismatch というエラーが表示されます。
このようにデータ型として INTEGER を指定し、 PRIMARY KEY 制約を設定したカラムに対しては、整数または整数に自動で変換される値しか格納することはできません。
なおデータ型が設定されたカラムに様々なデータ型の値を格納した時にどのように変換されて格納されるのかについては「SQLiteで利用可能なデータ型」を参照して下さい。
-- --
SQLite で利用可能制約の 1 つである PRIMARY KEY 制約の使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。