CREATE TABLE
| 対応: | SQL-92(1992) |
|---|
データベースに新しいテーブルを作成する命令です。列名・データ型・制約を定義してテーブルの構造を決めます。
構文
テーブルを作成します。
CREATE TABLE テーブル名 (
列名1 データ型 [制約],
列名2 データ型 [制約],
...
);
既存テーブルがない場合のみ作成します。
CREATE TABLE IF NOT EXISTS テーブル名 (
列名1 データ型 [制約],
...
);
主なデータ型一覧
| データ型 | MySQL / MariaDB | PostgreSQL | SQLite |
|---|---|---|---|
| 整数 | INT / BIGINT | INT / BIGINT | INTEGER |
| 自動連番 | AUTO_INCREMENT | SERIAL / GENERATED AS IDENTITY | INTEGER PRIMARY KEY(自動) |
| 固定小数点 | DECIMAL(p, s) | NUMERIC(p, s) | REAL(近似) |
| 可変長文字列 | VARCHAR(n) | VARCHAR(n) | TEXT |
| 長文文字列 | TEXT | TEXT | TEXT |
| 日付 | DATE | DATE | TEXT(文字列で管理) |
| 日時 | DATETIME / TIMESTAMP | TIMESTAMP | TEXT(文字列で管理) |
| 真偽値 | BOOLEAN(内部は TINYINT(1)) | BOOLEAN(ネイティブ) | INTEGER(0 / 1) |
固定小数点型の『DECIMAL(p, s)』の『p』は全体の桁数、『s』は小数点以下の桁数を意味します。例えば『DECIMAL(8, 2)』は整数部6桁・小数部2桁(例: 123456.78)を表します。
SQLite はデータ型の扱いが特殊で、内部的には『INTEGER』『REAL』『TEXT』『BLOB』の4種類しかありません。『VARCHAR(100)』のように書いても動作しますが、文字数の制限は適用されません。
MySQL / MariaDB
MySQL と MariaDB は構文がほぼ同じです。MariaDB は MySQL から派生(フォーク)したデータベースで、互換性があります。自動連番には『AUTO_INCREMENT』を使用します。
以下のような『members』テーブルを作成する例で説明します。
会員テーブルを作成します。
CREATE TABLE IF NOT EXISTS members (
member_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL,
points INT NOT NULL DEFAULT 0,
registered_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (member_id)
);
Query OK, 0 rows affected (0.03 sec)
テーブル定義を確認します。
SHOW COLUMNS FROM members;
+---------------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+-------------------+----------------+ | member_id | int | NO | PRI | NULL | auto_increment | | name | varchar(100) | NO | | NULL | | | email | varchar(255) | NO | | NULL | | | points | int | NO | | 0 | | | registered_at | datetime | NO | | CURRENT_TIMESTAMP | | +---------------+--------------+------+-----+-------------------+----------------+
PostgreSQL
PostgreSQL は自動連番に『SERIAL』または『GENERATED AS IDENTITY』を使用します。日時には『TIMESTAMP』を使い、『BOOLEAN』型がネイティブでサポートされています。
会員テーブルを作成します。自動連番には『SERIAL』を使用します。
CREATE TABLE IF NOT EXISTS members (
member_id SERIAL NOT NULL,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL,
points INT NOT NULL DEFAULT 0,
registered_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (member_id)
);
CREATE TABLE
テーブル定義を確認します。
\d members
Table "public.members"
Column | Type | Nullable | Default
----------------+------------------------+----------+-------------------------------------------
member_id | integer | not null | nextval('members_member_id_seq'::regclass)
name | character varying(100) | not null |
email | character varying(255) | not null |
points | integer | not null | 0
registered_at | timestamp | not null | CURRENT_TIMESTAMP
SQLite
SQLite はサーバー不要で動く軽量なデータベースです。データ型の扱いが柔軟で、『INTEGER PRIMARY KEY』と記述するだけで自動連番になります。日時は文字列(TEXT型)で管理します。
会員テーブルを作成します。『INTEGER PRIMARY KEY』で自動連番になります。日時は文字列(TEXT型)で管理します。
CREATE TABLE IF NOT EXISTS members (
member_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
points INTEGER NOT NULL DEFAULT 0,
registered_at TEXT NOT NULL DEFAULT (datetime('now'))
);
(出力なし。成功するとプロンプトに戻ります)
テーブル定義を確認します。
.schema members
CREATE TABLE members (
member_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
points INTEGER NOT NULL DEFAULT 0,
registered_at TEXT NOT NULL DEFAULT (datetime('now'))
);
.sql ファイルの実行方法については『.sqlファイルの作成と実行方法』を参照してください。
概要
『CREATE TABLE』はDDL(データ定義言語)に分類されます。テーブルを作成する際は各列に適切なデータ型を設定することが重要です。文字列は『VARCHAR』と『TEXT』を用途で使い分け、文字数の上限が決まっているもの(名前・メールアドレス等)は『VARCHAR』、上限が読めないもの(本文・説明文等)は『TEXT』を選ぶのが一般的です。
『IF NOT EXISTS』を付けると、テーブルがすでに存在していてもエラーが発生しません。何度実行しても同じ結果になる性質(冪等性)を持たせたいマイグレーションスクリプトなどで有用です。
同じ『CREATE TABLE』でも、自動連番・データ型・日時の扱いがデータベースごとに異なります。特にSQLiteは内部的に4つの型(INTEGER・REAL・TEXT・BLOB)しか持たないため、他のデータベースとは設計の考え方が変わります。SQLを学ぶ際はどのデータベースを使っているか意識しておくことが大切です。
制約(NOT NULL・UNIQUE・PRIMARY KEY等)の詳細は『NOT NULL / UNIQUE / DEFAULT』と『PRIMARY KEY / FOREIGN KEY』を参照してください。作成済みのテーブル定義を変更するには『ALTER TABLE』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。