PRIMARY KEY制約(主キー/プライマリキーを設定する)

プライマリーキー(主キー)は作成したテーブルの中の1つまたは複数のカラムの組み合わせに対して設定するもので、テーブルに格納されているデータを識別するための目印のようなものです。プライマリーキー制約を設定したカラムには、重複した値を格納することができなくなります。また NULL も格納することができません。その結果、プライマリーキー制約が設定されたカラムの値を検索することで、テーブルの中でただ一つのデータを特定することができます。ここでは MariaDB のテーブルでプライマリキーを設定して利用する方法について解説します。

(Last modified: )

PRIMARY KEY制約の使い方

テーブルを作成するときにカラムに対して PRIMARY KEY 制約を設定するには次の書式を使用します。

CREATE TABLE db_name.tbl_name
  (col_name data_type PRIMARY KEY,...)

カラムのデータ型のあとに PRIMARY KEY を記述します。 PRIMARY KEY 制約はテーブルごとに 1 つしか設定することができません。

では実際に試してみます。次のように実行してください。

create table user(id int primary key, name varchar(10));

PRIMARY KEY制約の使い方(1)

新しいテーブルを作成しました。テーブルの中の id カラムには PRIMARY KEY 制約が設定されています。

作成したテーブルのカラム情報を取得してみます。

show columns from user;

PRIMARY KEY制約の使い方(2)

PRIMARY KEY 制約が設定された id カラムには自動でインデックスが作成されており、 Key カラムの値に PRI と設定されています。また PRIMARY KEY 制約を設定したカラムには自動的に NOT NULL 制約が設定されるため NULL は格納することができなくなります。(NOT NULL 制約については「NOT NULL制約(カラムにNULLの格納を許可するかどうか)」を参照されてください)。

作成されたインデックスについて SHOW INDEX文を使って確認してみます。

show index from user\G

PRIMARY KEY制約の使い方(3)

作成されたインデックスの名前は PRIMARY で、 Non_unique が 0 となっているため、 id カラムには重複した値を格納することができません。

それでは作成したテーブルにデータを追加してみます。次のように実行して 2 つのデータを追加してください。

insert into user values(1, 'Tanaka');
insert into user values(4, 'Endou');

PRIMARY KEY制約の使い方(4)

問題なく追加することができました。

次に id カラムの値が既存のデータの値と同じデータを追加してみます。

insert into user values(4, 'Suzuki');

PRIMARY KEY制約の使い方(5)

「Duplicate entry '4' for key 'PRIMARY'」というエラーが発生してデータの追加に失敗しました。 PRIMARY KEY 制約が設定されているカラムには重複した値を格納することはできません。

複数のカラムの組み合わせに対してPRIMARY KEY制約を設定する

PRIMARY KEY 制約はテーブルに 1 つしか設定することができませんが、対象となるカラムは 1 つだけではなく 複数のカラムの組み合わせに対して設定することができます。例えば 2 つのカラムの組み合わせに対して設定した場合、 2 つのカラムに格納されている値の組み合わせが他のデータと重複することはできなくなります。

複数のカラムを対象とした PRIMARY KEY 制約を設定するには次の書式を使用します。

CREATE TABLE db_name.tbl_name
  (col_name1 data_type1 , col_name2 data_type2 , ..., 
   PRIMARY KEY(col_name1, col_name2, ...))

では実際に試してみます。次のように実行してください。

create table product (id int, color varchar(5), shape varchar(10), primary key (color, shape));

複数のカラムの組み合わせに対してPRIMARY KEY制約を設定する(1)

新しいテーブルを作成しました。テーブルの中の color カラムと shape カラムの組み合わせに対して PRIMARY KEY 制約が設定されています。

作成したテーブルのカラム情報を取得してみます。

show columns from product;

複数のカラムの組み合わせに対してPRIMARY KEY制約を設定する(2)

PRIMARY KEY 制約が設定された color カラムと shape カラムには自動でインデックスが作成されており、Key カラムの値をみていただくと PRI が設定されています。また PRIMARY KEY 制約を設定したカラムには自動的に NOT NULL 制約が設定されています。

作成されたインデックスについて SHOW INDEX文を使って確認してみます。

show index from product\G

複数のカラムの組み合わせに対してPRIMARY KEY制約を設定する(3)

複数のカラムの組み合わせに対してPRIMARY KEY制約を設定する(4)

インデックスは 2 つ作成されていますが、どちらもインデックスの名前は PRIMARY です。

それでは作成したテーブルにデータを追加してみます。次のように実行して 2 つのデータを追加してください。

insert into product values(1, 'Red', 'Rectangle');
insert into product values(2, 'Blue', 'Triangle');

複数のカラムの組み合わせに対してPRIMARY KEY制約を設定する(5)

問題なく追加することができました。

次に color カラムの値が既存のデータの値と同じですが shape カラムの値が異なるデータを追加してみます。

insert into product values(3, 'Red', 'Circle');

複数のカラムの組み合わせに対してPRIMARY KEY制約を設定する(6)

今回のデータも問題なく追加することができました。今回は color カラムの shape カラムの 2 つのカラムを対象に PRIMARY KEY 制約が設定されているので、この 2 つのカラムに格納する値の組み合わせと同じデータが対象のテーブルに格納済みの場合はエラーとなりますが、どちらか一つのカラムの値が同じだけであれば問題なく格納することができます。

次に color カラムと shape カラムの値の組み合わせが既存のデータの値と同じデータを追加してみます。

insert into product values(2, 'Blue', 'Triangle');

複数のカラムの組み合わせに対してPRIMARY KEY制約を設定する(7)

「Duplicate entry 'Blue-Triangle' for key 'PRIMARY'」というエラーが発生してデータの追加に失敗しました。今回は PRIMARY KEY 制約が設定されている 2 つのカラムの値の組み合わせが既にテーブルに存在していたのでエラーとなりました。

-- --

MariaDB のテーブルでプライマリキーを設定して利用する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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