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制約とは(1)

PRIMARY KEY 制約を設定して id カラムには重複した値を格納することができません。既に他のデータで格納されているのと同じ値を持つデータを格納しようとすると Error: UNIQUE constraint failed: user.id と表示されます。

insert into user values(1, 'Yamada');
insert into user values(2, 'Tanaka');
insert into user values(1, 'Honda');

PRIMARY KEY制約を設定した例(2)

このように 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);

INTEGER型のカラムにPRIMARY KEY制約を設定する場合(1)

それでは id カラムには値を指定せずにデータをいくつか格納してみます。

insert into user(name) values('Andou'); insert into user(name) values('Honda'); insert into user(name) values('Yamashita');

INTEGER型のカラムにPRIMARY KEY制約を設定する場合(2)

値を省略せずに PRIMARY KEY 制約が設定されたカラムに任意の数値を格納することもできます。ただし PRIMARY KEY 制約が設定されていますので重複する値は格納できません。

insert into user values(8, 'Kanemoto');

INTEGER型のカラムにPRIMARY KEY制約を設定する場合(3)

次に PRIMARY KEY 制約が設定されたカラムに値を指定せずにデータを追加すると、 PRIMARY KEY 制約が設定されてカラムに格納されている最大の値が 8 ですので、追加される値は 9 となります。

insert into user(name) values('Tokuda');

INTEGER型のカラムにPRIMARY KEY制約を設定する場合(4)

-- --

なお PRIMARY KEY 制約が設定されたカラムには同じ値を重複して格納することはできませんが、データを削除するとそのデータのカラムに格納されていた値は、別のデータを追加する時に指定することができます。

例えば現在 PRIMARY KEY 制約が設定されたカラムに格納されている値が 9 のデータを削除したあと、新しいデータとして PRIMARY KEY 制約が設定されたカラムに 9 を指定してデータを追加することができます。

INTEGER型のカラムにPRIMARY KEY制約を設定する場合(5)

このように PRIMARY KEY 制約が設定されたカラムには重複する値を格納することはできませんが、いったん削除してしまえば別のデータを追加するときに削除したものと同じ値をカラムに格納することができます。

-- --

SQLite ではテーブル作成時にカラムにデータ型を指定した場合でも、他のデータ型を格納してもエラーにはなりません。例えば INTEGER 型を設定したカラムに対して TEXT 型の値を格納する事も可能です。

create table numtest1(id integer);

INTEGER型のカラムにPRIMARY KEY制約を設定する場合(6)

これに対してカラムに対してデータ型として INTEGER を指定し、 PRIMARY KEY 制約を設定した場合はこのカラムには整数しか格納することはできなくなります。

create table numtest2(id integer primary key);

insert into numtest2 values(10);
insert into numtest2 values('7');
insert into numtest2 values('Hello');

INTEGER型のカラムにPRIMARY KEY制約を設定する場合(7)

INTEGER PRIMARY KEY が指定されているカラムに対し、数値の 10 や、TEXT型の値であっても '7' のような値であれば自動的に INTEGER 型の 7 に自動で変換されるためデータを追加することができますが、 'Hello' のような TEXT 型の値を格納しようとすると Error: datatype mismatch というエラーが表示されます。

データ型が設定されたカラムに様々なデータ型の値を格納した時にどのように変換されて格納されるのかについては「SQLiteで利用可能なデータ型」を参照して下さい。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。