こんにちは、かつコーチです。
ここまでの記事では、すでに用意されたテーブルに対してSELECTやINSERT・UPDATE・DELETEを実行する方法を見てきました。
今回はいよいよ「テーブルそのものを自分で作る」ところに踏み込みます。
CREATE TABLEは、データベースの中に新しい表(テーブル)を定義するSQL文です。
このCREATE TABLEを含む「テーブルの構造を作ったり変更したりするSQL」のことをDDL(Data Definition Language、データ定義言語)と呼びます。
これまで扱ってきたSELECTやINSERTなどはDML(Data Manipulation Language、データ操作言語)と呼ばれ、DDLとは役割が異なります。
DMLが「データの中身を操作する」ものだとすると、DDLは「データを入れる箱そのものを設計する」ものだとイメージすると分かりやすいです。
CREATE TABLEとは?
テーブルを定義するということ
テーブルを作るということは、「どんな列(カラム)を持ち、それぞれどんなデータ型を持つか」を決めるということです。
たとえば会員情報を管理するテーブルなら、「名前」「メールアドレス」「登録日」といった列を持たせる必要があります。
CREATE TABLEでは、この列の名前・データ型・制約をまとめて1つの文で定義します。
なぜテーブル設計が重要なのか
私が駆け出しの頃、とりあえず動けばいいと思って列の型や制約を適当に決めてテーブルを作ったことがあります。
その結果、後から「この列にNULLを許可していなかったせいでエラーになる」「文字数が足りずデータが切れる」といった問題が次々に出てきて、テーブルを作り直す羽目になりました。
テーブル設計は一度アプリが動き出すと変更コストが一気に上がります。
最初にしっかり設計しておくことが、後々の手戻りを減らす近道です。
基本の書き方
手順1:基本構文を理解する
CREATE TABLEの基本形は次の通りです。
CREATE TABLE テーブル名 (
カラム名1 データ型 制約,
カラム名2 データ型 制約,
...
);
実際に会員テーブルmembersを作ってみましょう。
CREATE TABLE members (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
idにはPRIMARY KEY(主キー)とAUTO_INCREMENT(自動採番)を指定し、emailには重複を許さないUNIQUE制約を付けています。
主キーや外部キーについては次回の記事で詳しく解説するので、ここでは「テーブルには一意に識別できる列を必ず用意する」というルールだけ押さえておいてください。
手順2:テーブルの中身を確認する
テーブルを作ったら、構造を確認しておきましょう。
DESCRIBE members;
-- または
SHOW COLUMNS FROM members;
DESCRIBEを実行すると、カラム名・データ型・NULL許可・キー情報・デフォルト値が一覧表示されます。
意図した通りの構造になっているか、作成直後に必ず確認する習慣をつけましょう。
手順3:既存テーブルがある場合の安全対策
同じ名前のテーブルがすでに存在すると、CREATE TABLEはエラーになります。
開発環境で何度も作り直す場合は、以下のように書いておくとエラーを避けられます。
CREATE TABLE IF NOT EXISTS members (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
IF NOT EXISTSを付けておくと、テーブルがすでに存在する場合は何もせず処理をスキップしてくれます。
ただし本番環境では、意図せず既存テーブルを放置してしまう可能性もあるため、使う場面は選びましょう。
つまずきやすいポイント:カラムの制約を後回しにする
NOT NULL制約を付け忘れる
テーブル設計でありがちなのが、「後から制約を付ければいい」と考えて、最初は制約なしでテーブルを作ってしまうケースです。
❌ Before:制約なしでテーブルを作成する
CREATE TABLE members (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(255)
);
この書き方だと、nameやemailにNULLを入れられてしまいます。
実際に私はこの状態のテーブルへアプリからテストデータを投入した際、nameが空のまま登録されてしまい、画面に会員名が表示されないバグに気づくまで半日かかったことがあります。
✅ After:必須項目にはNOT NULLを付ける
CREATE TABLE members (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL
);
「必ず入力されるべき項目にはNOT NULLを付ける」を設計時のデフォルトルールにしておくと、こうした事故を大きく減らせます。
応用:テーブルの削除・変更もセットで覚える
DROP TABLEでテーブルを削除する
作り直しが必要になった場合はDROP TABLEでテーブルごと削除できます。
DROP TABLE IF EXISTS members;
DROP TABLEはテーブルの構造ごとデータを全削除する強力なコマンドです。
本番環境で実行する際は、必ずバックアップを取ってから実行するようにしてください。
ALTER TABLEで後から構造を変更する
テーブル作成後に列を追加したくなった場合はALTER TABLEを使います。
ALTER TABLE members ADD COLUMN phone VARCHAR(20);
CREATE TABLEで一発の完璧な設計を目指すよりも、「まず作って、ALTER TABLEで育てていく」という発想を持っておくと、設計への心理的ハードルが下がります。
まとめ
この記事のポイント
- CREATE TABLEはテーブルの構造を定義するDDL(データ定義言語)
- カラム名・データ型・制約をセットで指定する
DESCRIBEでテーブル構造をいつでも確認できる- 必須項目には最初から
NOT NULLを付けるのが安全 DROP TABLEで削除、ALTER TABLEで後から構造変更できる
次に読むべき記事
CREATE TABLEで指定するデータ型には数値・文字列・日付などさまざまな種類があります。
次回はこのデータ型の選び方を詳しく見ていきましょう。
→ 次の記事:データ型の基本(数値・文字列・日付)
タグ: SQL, 初心者向け, DDL