CREATE DATABASE と CREATE TABLE
入れ物が無いと、1 行も入らない
ここまでは、誰かが用意したテーブルを読む側に立ってきました。自分でアプリを作る側に回ると、最初にやることは「どんな列を持つ表を用意するか」を決めて、その形をデータベースに伝えることです。表が無ければ、1 行も保存できません。
SQL の命令は、この 2 つに分かれます。表の形を作る側が DDL (CREATE や ALTER)、中身を出し入れする側が DML (SELECT や INSERT) です。ここからは前者の話になります。
まず、テーブルを置く入れ物を用意します。この演習環境は PostgreSQL 互換なので、入れ物は CREATE SCHEMA で作り、SET search_path で今どこを触るかを切り替えます。
SQL クエリ
CREATE SCHEMA shop_db;
SET search_path TO shop_db;MySQL や TiDB では CREATE DATABASE と USE が同じ役割です。この切り替えを忘れると、意図しない場所に表ができてしまい、後から探しても見つからない、ということが起きます。
「列名 型 制約」を、カンマで並べる
テーブルの定義は、列を 1 行ずつ並べるだけです。左から順に、列の名前、入る値の型、その列に課すルールを書きます。
SQL クエリ
CREATE TABLE staff (
id INT PRIMARY KEY,
full_name VARCHAR(60) NOT NULL,
hired_on DATE
);PRIMARY KEY は「この列の値で 1 行を特定できる」という宣言、NOT NULL は「空のままでは保存させない」という宣言です。hired_on のように何も付けなければ、空のままでも保存できます。入社日がまだ決まっていない人も登録できる、という意味になります。
つまずきやすいのは、最後の列の後ろにカンマを残してしまうことです。列をコピーして貼り、いらない行を消したときに起きます。
作った直後のテーブルは 0 行です。列の形だけが決まっていて、中身はまだ何もありません。
2 回流すと、そこで落ちる
同じ名前のテーブルが既にあると、CREATE TABLE は失敗します。手で 1 回打つだけなら気になりませんが、初期データを流すスクリプトや CI では、同じファイルを何度も実行することになります。
SQL クエリ
CREATE TABLE IF NOT EXISTS staff (
id INT PRIMARY KEY,
full_name VARCHAR(60) NOT NULL
);IF NOT EXISTS を付けておくと、既にある場合は何もせずに次へ進みます。
現場の話 テーブル名は複数形、列名は小文字のスネークケース (
full_nameのような書き方) にそろえるチームが多いです。MySQL は動く OS によって大文字と小文字を区別したりしなかったりするので、最初に決めて全員でそろえておくと、後から余計な事故を拾わずに済みます。
テーブル構造
-- 既にデータベースが用意されている状態を想定。
-- 空のスキーマ。あなたが CREATE TABLE で 2 つのテーブルを作ります。
SELECT 1;期待される出力
| table_name | column_count |
|---|---|
| categories | 2 |
| products | 4 |