データベースを扱う上で避けて通れないのが「プライマリーキー」です。この記事では、MySQL初心者の方に向けて、プライマリーキーの基本から設定方法、実務での使い方まで、わかりやすく解説します。
プライマリーキーとは?
プライマリーキー(PRIMARY KEY)は、テーブル内の各レコード(行)を一意に識別するための列(カラム)です。簡単に言えば、データベース内の各行に付ける「IDカード」のようなものと考えるとわかりやすいでしょう。
例えば、ユーザー情報を管理するテーブルでは、ユーザーIDをプライマリーキーに設定することで、「山田太郎」という同姓同名の人が複数いても、それぞれを確実に区別できます。
プライマリーキーの3つの特徴
- 一意性(ユニーク): 同じ値を持つレコードが存在できない
- NOT NULL: 空の値(NULL)を許可しない
- 1テーブル1つ: 1つのテーブルに設定できるのは1つだけ
なぜプライマリーキーが必要なのか?
プライマリーキーを設定することで、以下のメリットがあります。
データの整合性を保つ 重複したデータの登録を防ぎ、データベースの品質を維持できます。
検索速度の向上 プライマリーキーには自動的にインデックスが作成されるため、データの検索や取得が高速になります。
他のテーブルとの関連付け 外部キー(FOREIGN KEY)を使って他のテーブルと関連付ける際、プライマリーキーが基準となります。
テーブル作成時にプライマリーキーを設定する方法
新しくテーブルを作る際にプライマリーキーを設定する方法を見ていきましょう。
基本的な設定方法
最もシンプルな書き方は、カラム定義の後ろに PRIMARY KEY を付ける方法です。
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
このコードでは、id カラムをプライマリーキーに設定しています。
別の書き方(推奨)
複数人で開発する場合やテーブル定義を見やすくする場合は、以下の書き方がおすすめです。
CREATE TABLE users (
id INT,
name VARCHAR(100),
email VARCHAR(100),
PRIMARY KEY (id)
);
この書き方なら、テーブルの最後にプライマリーキーがまとめて記載されるため、どのカラムがキーなのか一目でわかります。
複合プライマリーキーの設定
複数のカラムを組み合わせてプライマリーキーにすることもできます。これを複合プライマリーキーと呼びます。
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
price DECIMAL(10, 2),
PRIMARY KEY (order_id, product_id)
);
この例では、「注文ID」と「商品ID」の組み合わせで一意性を保証しています。同じ注文に同じ商品は1つしか登録できませんが、異なる注文であれば同じ商品を登録できます。
既存のテーブルにプライマリーキーを追加する方法
すでに作成済みのテーブルに後からプライマリーキーを追加したい場合は、ALTER TABLE 文を使用します。
ALTER TABLE users
ADD PRIMARY KEY (id);
注意点
既存データがある場合、以下の条件を満たしている必要があります。
- 指定するカラムに重複した値がないこと
- 指定するカラムにNULL値がないこと
これらの条件を満たしていないと、エラーが発生してプライマリーキーを追加できません。
AUTO_INCREMENTと組み合わせる(実務で最頻出)
実務では、プライマリーキーに AUTO_INCREMENT を組み合わせるパターンが最も一般的です。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
AUTO_INCREMENTのメリット
- 自動採番: データを挿入するたびに、自動的に1ずつ増加した値が設定される
- 重複の心配なし: 手動で値を指定する必要がないため、重複エラーが発生しない
- 管理が簡単: IDの管理をMySQLに任せられる
実際の使用例
-- データ挿入時はIDを指定しない
INSERT INTO users (name, email)
VALUES ('山田太郎', 'yamada@example.com');
INSERT INTO users (name, email)
VALUES ('佐藤花子', 'sato@example.com');
-- 結果:idは自動的に1, 2, 3...と採番される
プライマリーキーを削除する方法
プライマリーキーを削除したい場合は、以下のSQL文を使用します。
ALTER TABLE users
DROP PRIMARY KEY;
削除時の注意点
AUTO_INCREMENTが設定されている場合、先にそれを解除する必要があることがあります- 外部キー制約で参照されている場合は、先に外部キーを削除する必要があります
よくあるエラーと解決方法
初心者がつまずきやすいエラーとその解決策をご紹介します。
エラー1: Duplicate entry(重複エラー)
ERROR 1062: Duplicate entry '1' for key 'PRIMARY'
原因: すでに存在する値を挿入しようとしている
解決方法:
AUTO_INCREMENTを使用する- 挿入前に既存データを確認する
エラー2: Multiple primary key defined(複数定義エラー)
ERROR 1068: Multiple primary key defined
原因: 1つのテーブルに2つ以上のプライマリーキーを設定しようとしている
解決方法:
- 複合キーにする場合は
PRIMARY KEY (col1, col2)の形式で1つにまとめる - または、どちらか1つだけをプライマリーキーにする
エラー3: Column cannot be null
ERROR 1171: All parts of a PRIMARY KEY must be NOT NULL
原因: NULL値を含むカラムにプライマリーキーを設定しようとしている
解決方法:
- 先にカラムを
NOT NULLに変更する - NULL値を持つレコードを削除または更新する
プライマリーキー設定のベストプラクティス
実務で役立つ推奨事項をまとめました。
1. 必ずプライマリーキーを設定する
すべてのテーブルにプライマリーキーを設定することを強く推奨します。プライマリーキーがないテーブルは、データの整合性やパフォーマンスの面で問題が発生しやすくなります。
2. 単純な整数型を使う
特別な理由がない限り、INT 型で AUTO_INCREMENT を使用するのがシンプルで効率的です。
id INT AUTO_INCREMENT PRIMARY KEY
大規模なシステムの場合は BIGINT を検討しましょう。
3. 意味のある値は避ける
メールアドレスや社員番号など、意味のある値をプライマリーキーにするのは避けましょう。これらの値は将来変更される可能性があり、変更時に多くの問題を引き起こします。
4. 複合キーは慎重に
複合プライマリーキーは必要な場合にのみ使用しましょう。多くの場合、単一の AUTO_INCREMENT カラムを追加する方がシンプルで管理しやすくなります。
5. 命名規則を統一する
チーム内でプライマリーキーの命名規則を統一すると、コードの可読性が向上します。一般的には id または テーブル名_id(例:user_id)が使われます。
まとめ
MySQLのプライマリーキーについて、設定方法から実務での使い方まで解説しました。
重要ポイントのおさらい
- プライマリーキーは各レコードを一意に識別するための必須要素
- テーブル作成時は
PRIMARY KEYで設定、既存テーブルにはALTER TABLEで追加 AUTO_INCREMENTとの組み合わせが実務では最も一般的- 1テーブルに1つだけ、NULL値は許可されない
- すべてのテーブルにプライマリーキーを設定することを推奨
プライマリーキーはデータベース設計の基礎中の基礎です。この記事で学んだ知識を活かして、堅牢なデータベースを構築していきましょう。