第02回: データベースとテーブルの作成 — 最初の定義がすべてを決める

章: 第1章: 基礎と環境構築

「とりあえずテーブルを作ろう」が後で痛い目を見る理由

DB設計でよくある失敗は、文字コードを指定せずにテーブルを作り、絵文字が入らなかったり日本語が文字化けしたりすること。あるいはカラムの型を雑に決めて、後から ALTER TABLE で大量データを抱えたまま変更しようとして詰まること。

最初の定義が、後のマイグレーションや運用のすべてに影響します。 この記事では CREATE DATABASECREATE TABLE の正しい書き方を身につけましょう。

「なんとなく作る」vs「意図を持って設計する」

問題は知識不足よりも「何を決めておくべきか」が見えていないことです。テーブル作成時に意識すべき点は3つに絞れます。

1. 文字コード: utf8mb4 + utf8mb4_unicode_ci で統一する

2. 主キーの型: BIGINT UNSIGNED AUTO_INCREMENT が現代のベストプラクティス

3. NOT NULL制約: 曖昧なNULLを避けてデフォルト値を明示する

良い設計・悪い設計の比較

項目 悪い例 良い例
文字コード 未指定(latin1になる場合あり) utf8mb4 を明示
主キー型 INT BIGINT UNSIGNED AUTO_INCREMENT
日時カラム VARCHAR(20) に日付文字列 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
NULL許可 全カラムにNULL許可 必要な列のみNULL許可、他は NOT NULL

チェックポイント: utf8mb4 は絵文字を含む4バイト文字に対応しています。utf8(3バイト)だと絵文字の保存時にエラーになるため、日本語サービスでは必ず utf8mb4 を指定しましょう。

実際のコードのサンプル


CREATE DATABASE blog_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE blog_app;

CREATE TABLE users (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(255) NOT NULL UNIQUE,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

まとめ & 次のステップ

  • CREATE DATABASE では文字コード(utf8mb4)と照合順序を必ず指定する
  • 主キーは BIGINT UNSIGNED AUTO_INCREMENT が現代のスタンダード
  • NOT NULL を基本とし、NULLを許可する理由を列ごとに説明できる状態を目指す
  • UNIQUE 制約はインデックスを自動的に生成するため、重複防止と検索速度向上を兼ねる

次回は 「主キー・外部キーの基本」 を学びます。テーブル間のリレーションを正しく定義して、データの一貫性を守る方法を確認します。

Related Articles