Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

CREATE TABLE

データベースに新しいテーブルを作成する命令です。列名・データ型・制約を定義してテーブルの構造を決めます。

構文
-- テーブルを作成します。
CREATE TABLE テーブル名 (
    列名1 データ型 [制約],
    列名2 データ型 [制約],
    ...
);

-- 既存テーブルがない場合のみ作成します。
CREATE TABLE IF NOT EXISTS テーブル名 (
    列名1 データ型 [制約],
    ...
);
主なデータ型一覧
データ型概要
INT整数を格納します。MySQLでは -2,147,483,648〜2,147,483,647 の範囲です。
BIGINT大きな整数を格納します。ID列などに使用します。
DECIMAL(p, s)精度 p・小数点以下 s 桁の固定小数点数を格納します。金額など精度が重要なデータに使います。
VARCHAR(n)最大 n 文字の可変長文字列を格納します。名前・メールアドレスなどに使用します。
TEXT長文の文字列を格納します。記事本文・コメントなどに使用します。
DATE日付(YYYY-MM-DD)を格納します。
DATETIME日時(YYYY-MM-DD HH:MM:SS)を格納します。
TIMESTAMP日時をタイムスタンプで格納します。MySQLでは自動更新設定が可能です。
BOOLEAN真偽値(TRUE / FALSE)を格納します。MySQLでは内部的に TINYINT(1) として扱われます。
サンプルコード
-- 会員テーブルを作成します。
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)
);

-- 商品テーブルを作成します。
CREATE TABLE IF NOT EXISTS products (
    product_id   INT            NOT NULL AUTO_INCREMENT,
    product_name VARCHAR(200)   NOT NULL,
    price        DECIMAL(10, 2) NOT NULL,
    stock        INT            NOT NULL DEFAULT 0,
    created_at   TIMESTAMP      NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (product_id)
);
実行結果
-- SHOW COLUMNS FROM members; でテーブル定義を確認した結果例
-- +---------------+--------------+------+-----+-------------------+
-- | Field         | Type         | Null | Key | Default           |
-- +---------------+--------------+------+-----+-------------------+
-- | member_id     | int          | NO   | PRI | NULL              |
-- | name          | varchar(100) | NO   |     | NULL              |
-- | email         | varchar(255) | NO   |     | NULL              |
-- | points        | int          | NO   |     | 0                 |
-- | registered_at | datetime     | NO   |     | CURRENT_TIMESTAMP |
-- +---------------+--------------+------+-----+-------------------+
データベース別の書き方

『CREATE TABLE』と『IF NOT EXISTS』の基本構文は主要なデータベースで共通して使用できます。ただし、データ型と自動連番の書き方に違いがあります。

-- MySQL
CREATE TABLE IF NOT EXISTS members (
    member_id     INT           NOT NULL AUTO_INCREMENT,
    name          VARCHAR(100)  NOT NULL,
    points        INT           NOT NULL DEFAULT 0,
    registered_at DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (member_id)
);

PostgreSQL は自動連番に『SERIAL』または『GENERATED AS IDENTITY』を使用します。『BOOLEAN』型がネイティブでサポートされています。

-- PostgreSQL
CREATE TABLE IF NOT EXISTS members (
    member_id     SERIAL        NOT NULL,
    name          VARCHAR(100)  NOT NULL,
    points        INT           NOT NULL DEFAULT 0,
    registered_at TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (member_id)
);

SQL Server は自動連番に『IDENTITY』を使用します。『IF NOT EXISTS』はサポートされていないため、存在チェックには『IF NOT EXISTS (SELECT ...)』を使います。

-- SQL Server
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'members')
CREATE TABLE members (
    member_id     INT           NOT NULL IDENTITY(1,1),
    name          NVARCHAR(100) NOT NULL,
    points        INT           NOT NULL DEFAULT 0,
    registered_at DATETIME2     NOT NULL DEFAULT GETDATE(),
    PRIMARY KEY (member_id)
);

SQLite はデータ型の指定が柔軟で、『INTEGER PRIMARY KEY』と記述すると自動連番になります。

-- SQLite
CREATE TABLE IF NOT EXISTS members (
    member_id     INTEGER  PRIMARY KEY,
    name          TEXT     NOT NULL,
    points        INTEGER  NOT NULL DEFAULT 0,
    registered_at TEXT     NOT NULL DEFAULT (datetime('now'))
);
概要

『CREATE TABLE』はDDL(データ定義言語)に分類されます。テーブルを作成する際は各列に適切なデータ型を設定することが重要です。文字列は『VARCHAR』と『TEXT』を用途で使い分け、文字数の上限が決まっているもの(名前・メールアドレス等)は『VARCHAR』、上限が読めないもの(本文・説明文等)は『TEXT』を選ぶのが一般的です。

『IF NOT EXISTS』を付けると、テーブルがすでに存在していてもエラーが発生しません。マイグレーションスクリプトなどで冪等性を持たせたいときに有用です。

制約(NOT NULL・UNIQUE・PRIMARY KEY等)の詳細は『NOT NULL / UNIQUE / DEFAULT』と『PRIMARY KEY / FOREIGN KEY』を参照してください。作成済みのテーブル定義を変更するには『ALTER TABLE』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。