プライマリーキー制約

広告

カラムに対してプライマリーキー制約を設定する方法を確認します。書式は次の通りです。

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

カラムに対してプライマリーキー制約を設定する場合はPRIMARY KEYと同時にNOT NULLも設定する必要があります。(もし指定しなかった場合は自動的に設定されます)。またテーブルの中でプライマリーキー制約は一つしか設定することができません。(複数のカラムを対象にプライマリーキー制約を設定することは可能です)。

プライマリーキー制約が設定されたカラムには重複する値は格納することができません。またNULLも格納できません。

カラムにプライマリーキー制約を設定するとそのカラムを対象としたユニークインデックスも同時に設定されます。(カラムにプライマリーキー制約を付けるということは、そのカラムを対象としたPRIMARYという名前のユニークインデックスを作成すると考えても構いません)。

では実際に試してみます。次のようなテーブルを作成します。

mysql> create table pritest(id int not null primary key, name varchar(10));

p8-1

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

p8-2

プライマリーキー制約が設定されたカラムの「Key」列の値に「PRI」が設定されていることが分かります。

またインデックスについても確認してみます。次のように入力して下さい。

mysql> show index from pritest¥G

p8-3

詳しいことはインデックスのページで確認しますが、「id」カラムを対象としたインデックスが1つあり、「Non_unique」が0なのでユニークインデックスであることを表しています。

ではデータを追加してみます。

p8-4

続いてプライマリーキー制約が設定されているカラムに、既に存在している値と同じ値を持つデータを追加してみます。

p8-5

このように重複した値は格納することができません。

またNULLも格納することはできません。

p8-6

複数のカラムを対象にプライマリーキー制約を設定

カラムに対してプライマリーキー制約を設定するには次の書式も使用することができます。

CREATE TABLE db_name.tbl_name
  (col_name1 data_type1 NOT NULL, col_name2 data_type2, ...,
  PRIMARY KEY(index_col_name1, index_col_name2, ...));

最初の書式ではカラム定義の時にPRIMARY KEYを指定していましたが、今回の書式では後からプライマリーキー制約を付けるカラムを指定しています。どちらの書式を使った場合でも結果は同じです。

なおこの書式の場合には複数のカラムを対象にプライマリーキー制約を設定できます。この場合、複数のカラムの組み合わせが重複したデータは格納できません。

では実際に試してみます。次のようなテーブルを作成します。

mysql> create table pritest2(
    -> gakunen int not null, kumi varchar(10) not null, name varchar(20),
    -> primary key(gakunen, kumi));

p8-7

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

p8-8

今回は複数のカラムを対象にプライマリーキー制約を設定していますので、複数のカラムの「Key」列の値に「PRI」が設定されていることが分かります。

またインデックスについても確認してみます。次のように入力して下さい。

mysql> show index from pritest2¥G

p8-9

複数のカラムを対象にユニークインデックスが作成されていますので、「Key_name」に同じ値が設定されたデータが2つあります。(このデータの詳しい見方はインデックスのページで確認します)。

ではデータを追加してみます。

p8-10

続いてプライマリーキー制約が設定されている複数のカラムの中で1つだけ既存の値と同じデータを追加してみます。

p8-11

複数のカラムを対象にプライマリーキー制約を設定している場合、複数のカラムの値の組み合わせが既存のデータと完全に一致するデータは格納できませんが、いずれか一つのカラムの値が既存の値と同じである場合は格納できます。

ではプライマリーキー制約が設定されている複数のカラムの値の組み合わせが既存の値と一致するデータを追加してみます。

p8-12

このようにエラーが発生してデータを追加することができませんでした。

( Written by Tatsuo Ikura )