【これだけ】MySQLのキー【現役エンジニアが解説】

PROGRAM

今回は、MySQLのキーについて、プライマリキー(主キー)とユニークキーに分け、簡単に解説していきます。

プライマリキー(主キー)

プライマリキー(主キーとも呼ばれる)は、テーブル上でそのカラムの値を一意とする場合に設定します。

例えば、ユーザテーブルではユーザID、社員テーブルでは社員番号等、特定のレコードを指し示すカラムを作る際に設定をします。

CREATE TABLE users(
    user_id INT NOT NULL AUTO_INCREMENT,
    user_cd VARCHAR(5) NOT NULL,
    user_name VARCHAR(50) NOT NULL,
    PRIMARY KEY (user_id)
);

MySQLでプライマリキーを設定する場合は、CREATE TABLE文でPRIMARY KEYを明示する必要があります。

上記のSQL文のように明記することで、user_idのカラムの値には重複が起こらず、必ずテーブル上で一意に定まることになります。

ユニークキー

ユニークキーも、プライマリキーと同様に、設定したカラムの値がテーブル上で重複しないようにさせるための設定となります。

ただ、プライマリキーはそのテーブルの中でレコードを特定する主たるキーであるのに対し、ユニークキーは単純に重複を許さないという目的のキー設定に過ぎません。

CREATE TABLE users(
    user_id INT NOT NULL AUTO_INCREMENT,
    user_cd VARCHAR(5) NOT NULL,
    user_name VARCHAR(50) NOT NULL,
    PRIMARY KEY (user_id),
    UNIQUE KEY (user_cd)
);

MySQLでユニークキーを設定する場合は、CREATE TABLE文の中でプライマリキーと同様の仕方で設定をすれば良いだけです。

外部キー

キーと言えば、大体の場合はプライマリキーとユニークキーの二つを押さえておけば十分です。

この記事では、外部キーというものに関しても、おまけ程度に解説をしますが、初学者の方はスキップして頂いて差支えありません。

例えば、マスタのテーブルのキーのカラムを、非マスタのテーブルに持たせるという場合には、その二つを連動させたいというケースが出てくることがあります。

このような場合には、外部キーというものを設定することにより、非マスタの子テーブルでキーが残っている状態では、マスタから対象のキーレコードを削除できないようにするといったことができます。

CREATE TABLE posts(
    posts_id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(50) NOT NULL,
    body TEXT NOT NULL,
    user_id INT NOT NULL,
    INDEX user_id_index(user_id), 
    FOREIGN KEY fk_user_id(user_id) REFERENCES users(user_id)
);

外部キーを設定する際は少し複雑で、上記のように非マスタの方の子テーブルでインデックスを設定する必要があります。

ここでは、先程作成したusersテーブルをマスタの親テーブルとして、子テーブルのpostsテーブルというものを作り、親テーブルのuser_idカラムを外部キーに設定しています。

INDEXの後ろには任意のインデックス名を付け、その括弧の中には外部キーに設定する子テーブル側のカラム名を入れ、FOREIGN KEYの後ろには外部キー名と括弧内に外部キーに設定する子テーブルのカラム名を入れています。

最後のREFERENCESの後ろには親テーブルの名前を書き、その括弧内には外部キーに設定する親テーブル側のカラム名を入れることで、外部キーによるテーブルの親子関係を設定し、削除等の面で外部キー制約をかけることができます。