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) の使い分けが言える TRUNCATEとDELETEの違い (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 | TRUNCATE と DELETE の挙動を比較 (件数の前後を観察) |
採点 DB について
採点ランナー (scripts/grade.php) は環境変数 DOJO_DB_DRIVER で接続先を切り替える。
- 未指定 /
sqlite→ 一時 SQLite ファイル (Docker 不要・既定) mysql→docker composeの MySQL コンテナ (3306)pgsql→docker 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_INCREMENTはINT以上で使う。TINYINT(最大 127) で採番すると 128 件目で詰まる。TRUNCATEはトランザクションでロールバックできない (DDL 扱い)。本番ではDELETE FROM ... WHERE ...を選ぶことが多い。DATETIMEはサーバ TZ に依らない固定値、TIMESTAMPは UTC 保存 + 表示時 TZ 変換。用途で使い分ける。
演習問題(3問)
-
ドリル 01 — AUTO_INCREMENT で連番 ID を自動採番する
-
ドリル 02 — テーブル一覧を取得する (driver 別の SHOW TABLES 相当)
-
ドリル 03 — TRUNCATE と DELETE の挙動を比較する
サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリ(nomuraya-dojo/php)を clone してください。