言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. CREATE TABLE

CREATE TABLE

対応: SQL-92(1992)

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

構文

テーブルを作成します。

CREATE TABLE テーブル名 (
    列名1 データ型 [制約],
    列名2 データ型 [制約],
    ...
);

既存テーブルがない場合のみ作成します。

CREATE TABLE IF NOT EXISTS テーブル名 (
    列名1 データ型 [制約],
    ...
);

主なデータ型一覧

データ型MySQL / MariaDBPostgreSQLSQLite
整数INT / BIGINTINT / BIGINTINTEGER
自動連番AUTO_INCREMENTSERIAL / GENERATED AS IDENTITYINTEGER PRIMARY KEY(自動)
固定小数点DECIMAL(p, s)NUMERIC(p, s)REAL(近似)
可変長文字列VARCHAR(n)VARCHAR(n)TEXT
長文文字列TEXTTEXTTEXT
日付DATEDATETEXT(文字列で管理)
日時DATETIME / TIMESTAMPTIMESTAMPTEXT(文字列で管理)
真偽値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』テーブルを作成する例で説明します。

members member_id name email registered_at (empty set) Empty set

会員テーブルを作成します。

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』を参照してください。

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