topic: db (PDO / SQL / マルチDB) / ch11

ch11 — MySQL 固有の文法と運用

学習目標

このチャプターが終わると、次のことが言える / 書ける。

  • AUTO_INCREMENT で連番 ID を自動生成できる (SQLite の AUTOINCREMENT / PostgreSQL の SERIAL との違いを言える)
  • utf8mb4 を使う理由 (絵文字を含む 4-byte UTF-8 対応) を言える
  • SHOW TABLES / DESCRIBE <table> / SHOW CREATE TABLE <table> でスキーマを確認できる
  • MySQL のデータ型 (TINYINT / INT / BIGINT / VARCHAR(n) / TEXT / DATETIME / TIMESTAMP) の使い分けが言える
  • TRUNCATEDELETE の違い (TRUNCATE は AUTO_INCREMENT もリセット) が言える
  • ENGINE=InnoDB の意味 (トランザクション・外部キーが使える) が言える

所要時間

スライド 6 分 + ドリル 3 問 = 約 1.5 時間

前提

L11 ch01〜ch10 を理解していること (PDO 接続 / SELECT / INSERT / UPDATE / DELETE / prepare / execute / トランザクション / マルチ DB 対応まで)。

ドリル

no 内容
01 AUTO_INCREMENT を持つテーブルに 3 件 INSERT して自動採番 ID を確認
02 SHOW TABLES 相当の操作でテーブル一覧を出力 (driver 別分岐)
03 TRUNCATEDELETE の挙動を比較 (件数の前後を観察)

採点 DB について

採点ランナー (scripts/grade.php) は環境変数 DOJO_DB_DRIVER で接続先を切り替える。

  • 未指定 / sqlite → 一時 SQLite ファイル (Docker 不要・既定)
  • mysqldocker compose の MySQL コンテナ (3306)
  • pgsqldocker compose の PostgreSQL コンテナ (5432)

各 drill には tests/setup.sql (SQLite 用 / 既定) のほかに、tests/setup.mysql.sql / tests/setup.pgsql.sql を置いている。採点ランナーは driver を見て自動で使い分ける。

MySQL 固有の章なので、本来は DOJO_DB_DRIVER=mysql で動かしてほしい。デフォルトの SQLite でも同じ標準出力になるように、各 drill は driver による分岐 (または DB に依らない結果の取り出し) を使っている。

ハマりどころ

  • utf8 (古い・最大 3-byte) と utf8mb4 (新しい・絵文字 OK) は別物。新規テーブルは必ず utf8mb4 を指定する。
  • AUTO_INCREMENTINT 以上で使う。TINYINT (最大 127) で採番すると 128 件目で詰まる。
  • TRUNCATE はトランザクションでロールバックできない (DDL 扱い)。本番では DELETE FROM ... WHERE ... を選ぶことが多い。
  • DATETIME はサーバ TZ に依らない固定値、TIMESTAMP は UTC 保存 + 表示時 TZ 変換。用途で使い分ける。

演習問題(3問)

  1. ドリル 01 — AUTO_INCREMENT で連番 ID を自動採番する

    starter.php answer.php

  2. ドリル 02 — テーブル一覧を取得する (driver 別の SHOW TABLES 相当)

    starter.php answer.php

  3. ドリル 03 — TRUNCATE と DELETE の挙動を比較する

    starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリ(nomuraya-dojo/php)を clone してください。