#02 MySQLデータベースを使ってみよう

データベースとテーブルを作る

データベースの構造を理解する

MySQLでは、データベース → テーブル → 行・列 という階層でデータを管理します。

  • データベース? データを整理して保存・検索できるソフトウェア。Webアプリのユーザー情報や投稿データなどはここに保存される。 : プロジェクトやアプリケーション単位でまとめるコンテナ
  • テーブル? データベース内のデータの入れ物。Excelのシートのように行と列でデータを管理する。 : 実際のデータを格納する表。「users」「products」など目的ごとに作る
  • カラム? テーブルの列のこと。「名前」「メールアドレス」「作成日時」など、データの項目ごとに定義する。 (列): テーブルのフィールド定義(名前・年齢・メールアドレスなど)
  • 行(レコード): 実際のデータ1件分
データベース → テーブル → 行・列 の階層構造 MySQL Server データベース: myapp_db テーブル: users id name email age ← カラム(列) → 1 田中 太郎 taro@... 28 2 佐藤 花子 hanako@... 34 3 鈴木 一郎 ichiro@... 22 ↑ 行(レコード)1件 = ユーザー1人分のデータ テーブル: orders id user_id product total 1 1 ノートPC 89800 2 1 マウス 3200 3 2 キーボード 12000 外部キー 1つのデータベースに複数のテーブルを作成でき、外部キーでテーブル間を関連付けられる
図1: データベース→テーブル→行・列の階層構造

データベースを作成する

-- データベースを作成(文字コードを明示的に指定)
CREATE DATABASE myapp_db
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

-- 既に存在してもエラーにしない
CREATE DATABASE IF NOT EXISTS myapp_db
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

-- 作成したDBを選択
USE myapp_db;

utf8mb4 は日本語や絵文字にも対応した文字コードです。utf8 との違いは絵文字(4バイト文字)に対応しているかどうかで、現代のアプリでは utf8mb4 を使うのが標準です。


テーブルを作成する

基本的な CREATE TABLE

CREATE TABLE users (
  id        INT           NOT NULL AUTO_INCREMENT,
  name      VARCHAR(100)  NOT NULL,
  email     VARCHAR(255)  NOT NULL,
  age       INT,
  is_active BOOLEAN       NOT NULL DEFAULT TRUE,
  created_at TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

主要なデータ型

データ型? カラムに格納できる値の種類。INT(整数)・VARCHAR(可変長文字列)・DATE(日付)・BOOLEAN(真偽値)などがある。適切な型を選ぶとデータの整合性が保たれ、パフォーマンスも向上する。 の選択はテーブル設計で非常に重要です。

MySQLの主要データ型 数値型 INT 整数(±約21億) BIGINT 大きな整数 DECIMAL(m,d) 精度付き小数 BOOLEAN 真偽値 文字列型 VARCHAR(n) 可変長文字列 CHAR(n) 固定長文字列 TEXT 長い文字列 ENUM('a','b') 列挙型 日時型 DATE 日付のみ DATETIME 日時(固定) TIMESTAMP タイムスタンプ TIME 時刻のみ 使い分けの目安 id → INT (AUTO_INCREMENT) name → VARCHAR(100) price → DECIMAL(10, 2) ※浮動小数点は誤差が出るため避ける birthday → DATE created_at → TIMESTAMP DEFAULT CURRENT_TIMESTAMP description → TEXT ※255文字を超える場合
図2: MySQLの主要なデータ型一覧
データ型説明
INT整数(-2億〜2億)年齢、個数
BIGINT大きな整数ユーザーID(大規模)
VARCHAR(n)可変長文字列(最大n文字)名前、メール
TEXT長い文字列記事本文
DATE日付(YYYY-MM-DD)誕生日
DATETIME日時(YYYY-MM-DD HH:MM:SS)予約日時
TIMESTAMPタイムスタンプ作成日時
BOOLEAN真偽値(TINYINT(1)のエイリアス)フラグ
DECIMAL(m,d)精度の高い小数金額

カラムの制約

制約? カラムに設定するルール。NOT NULL(空値禁止)・UNIQUE(重複禁止)・PRIMARY KEY(主キー)・FOREIGN KEY(外部キー)・DEFAULT(デフォルト値)などがある。 を使うことで、データの整合性を保てます。

PRIMARY KEY(主キー)

主キー? テーブルの各行を一意に識別するためのカラム。通常は自動で採番される`id`が使われる。 はテーブル内のレコードを一意に識別するカラムです。NULLは許可されず、重複もできません。

-- 単一カラムの主キー
PRIMARY KEY (id)

-- 複合主キー(2つのカラムの組み合わせで一意)
PRIMARY KEY (user_id, product_id)

AUTO_INCREMENT(自動採番)

AUTO_INCREMENT? MySQLで主キーなどに使う自動採番機能。新しい行を挿入するたびに値が自動で1ずつ増える。手動でIDを管理する手間がなくなる。 を指定すると、INSERT時に自動で連番が振られます。

id INT NOT NULL AUTO_INCREMENT

NOT NULL と DEFAULT

-- NULLを許可しない
name VARCHAR(100) NOT NULL

-- デフォルト値を設定
status VARCHAR(20) NOT NULL DEFAULT 'active'
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

UNIQUE(ユニーク制約)

-- カラム定義に追加
email VARCHAR(255) NOT NULL UNIQUE

-- テーブル末尾に追加
UNIQUE KEY uk_email (email)

実践: productsテーブルを作る

CREATE TABLE products (
  id          INT           NOT NULL AUTO_INCREMENT,
  name        VARCHAR(200)  NOT NULL,
  description TEXT,
  price       DECIMAL(10, 2) NOT NULL,
  stock       INT           NOT NULL DEFAULT 0,
  category    VARCHAR(50),
  created_at  TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at  TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP
                            ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

ON UPDATE CURRENT_TIMESTAMP は、レコードが更新されるたびに自動で現在時刻がセットされる便利なオプションです。


テーブル構造を確認する

-- テーブルの構造を確認
DESCRIBE users;
-- または
DESC users;
+-----------+--------------+------+-----+-------------------+-------------------+
| Field     | Type         | Null | Key | Default           | Extra             |
+-----------+--------------+------+-----+-------------------+-------------------+
| id        | int          | NO   | PRI | NULL              | auto_increment    |
| name      | varchar(100) | NO   |     | NULL              |                   |
| email     | varchar(255) | NO   | UNI | NULL              |                   |
| age       | int          | YES  |     | NULL              |                   |
| is_active | tinyint(1)   | NO   |     | 1                 |                   |
| created_at| timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+-----------+--------------+------+-----+-------------------+-------------------+

テーブル・データベースを削除する

-- テーブルを削除
DROP TABLE users;

-- 存在する場合のみ削除(エラー回避)
DROP TABLE IF EXISTS users;

-- データベースを削除(中のテーブルもすべて消える)
DROP DATABASE myapp_db;

注意: DROP TABLEDROP DATABASE は元に戻せません。本番環境では必ずバックアップを取ってから実行しましょう。


まとめ

  • CREATE DATABASE でデータベースを、CREATE TABLE でテーブルを作成する
  • データ型は用途に合ったものを選ぶ(文字列は VARCHAR、整数は INT など)
  • PRIMARY KEYNOT NULLAUTO_INCREMENT は必ず覚える
  • DESCRIBE テーブル名 でカラム定義を確認できる
  • 削除は DROP TABLE / DROP DATABASE(元に戻せないので注意)

次回は実際にデータを挿入・取得する INSERTSELECT を学びます。