MySQL でテーブルの作成 (CREATE TABLE)

ここでは MySQL でテーブルを作成する方法をご説明します。

CREATE TABLE で新しいテーブルを作成する

MySQL で新しいテーブルを作成するには CREATE TABLE 文を使います。

いろんなオプションが指定できますが、一番基本の CREATE 文の構文は次のようなものになります。

CREATE TABLE テーブル名 (
    カラム名1 データ型 [NOT NULL | NULL],
    カラム名2 データ型 [NOT NULL | NULL],
    カラム名3 データ型 [NOT NULL | NULL],
   ....
);

リレーショナルデータベースでは、通常これに加えて主キーや外部キーなどの制約を追加します。


サンプルとして、学生の情報を保持するための students テーブルを作ってみましょう。

次のようなカラムを持つ students テーブルを作ります。

  • student_id: レコードの ID(整数型)
  • student_number: 学生番号(最大 10 桁の文字列型)
  • first_name: 下の名前(最大 50 桁の文字列型)
  • last_name: 名字(最大 50 桁の文字列型)
  • middle_name: ミドルネーム(最大 50 桁の文字列型)
  • birthday: 誕生日(日付型)
  • gender: 性別(一文字の文字列型で M: 男性、F: 女性)
  • paid_flag: 授業料を払ったかどうかのフラグ(BOOL 型で FALSE (0): 未払い、TRUE (1): 支払い済み)

こちらが、カラム名、データ型、NOT NULL か NULL かを指定しただけの CREATE TABLE 文です。

CREATE TABLE students (
    student_id      INT             NOT NULL,
    student_number  VARCHAR(10)     NOT NULL,
    first_name      VARCHAR(50)     NOT NULL,
    last_name       VARCHAR(50)     NOT NULL,
    middle_name     VARCHAR(50)     NULL,
	birthday  	    DATE            NOT NULL
    gender          ENUM ('M','F')  NOT NULL,
    paid_flag       BOOL            NOT NULL
);

これに順番に制約などを加えていきましょう。


CREATE TABLE で主キー (PRIMARY KEY) 制約を指定する

主キー (PRIMARY KEY) 制約はテーブルで一番大事な制約で、全テーブルに定義するべき制約です。

主キーは、そのテーブルの各行を一意に特定するためのカラムやカラムのコンビネーションのことで、各テーブルにひとつだけ設定できます。

MySQL のデフォルトのストレージエンジンである InnoDB では、主キーを定義すると、それをクラスター化インデックス (clustered index) として使い、データは主キー順に物理的に格納されます。

主キーをつけるカラムやカラムのコンビネーションは、ユニークで、かつ NOT NUL のカラムでなくてはなりません。


CREATE TABLE で主キー (PRIMARY KEY) 制約を指定するには PRIMARY KEY キーワードを使います。

カラムの定義に続けて指定してもいいですし、下の例のように別の行にしてカラム名を指定しても大丈夫です。

CREATE TABLE テーブル名 (
    カラム名1 データ型 NOT NULL PRIMARY KEY,
    カラム名2 データ型 [NOT NULL | NULL],
    カラム名3 データ型 [NOT NULL | NULL],
    ....
);
CREATE TABLE テーブル名 (
    カラム名1 データ型 NOT NULL,
    カラム名2 データ型 NOT NULL,
    カラム名3 データ型 [NOT NULL | NULL],
    ....
    PRIMARY KEY (カラム名1, カラム名2)
);

先ほどの students テーブルの student_id カラムを主キーに指定します。

今回はデータを挿入した時に自動的に id となる数字を採番して欲しいので、AUTO_INCREMENT 属性も一緒に指定しました。

CREATE TABLE students (
    student_id      INT             NOT NULL AUTO_INCREMENT,
    student_number  VARCHAR(10)     NOT NULL,
    first_name      VARCHAR(50)     NOT NULL,
    last_name       VARCHAR(50)     NOT NULL,
    middle_name     VARCHAR(50)     NULL,
	birthday  	    DATE            NOT NULL,
    gender          ENUM ('M','F')  NOT NULL,
    paid_flag       BOOL            NOT NULL,
    PRIMARY KEY (student_id)
);

CREATE TABLE でユニークキー (UNIQUE KEY) 制約を指定する

カラムに入る値がユニークになる場合は、ユニークキー (UNIQUE KEY) 制約をつけておくと良いと思います。

ユニークキー制約がついていると、重複した値を入れようとするとエラーになり、間違いも防ぐことができます。


CREATE TABLE でユニークキー (UNIQUE KEY) 制約を指定するには UNIQUE KEY キーワードを使います。

主キーと同様に、カラムの定義に続けて指定してもいいですし、下の例のように別の行にしてカラム名を指定しても大丈夫です。

CREATE TABLE テーブル名 (
    カラム名1 データ型 [NOT NULL | NULL],
    カラム名2 データ型 [NOT NULL | NULL] UNIQUE KEY,
    カラム名3 データ型 [NOT NULL | NULL],
    ....
);
CREATE TABLE テーブル名 (
    カラム名1 データ型 [NOT NULL | NULL],
    カラム名2 データ型 [NOT NULL | NULL],
    カラム名3 データ型 [NOT NULL | NULL],
    ....
    UNIQUE KEY (カラム名1, カラム名2)
);

先ほどの students テーブルの student_number はユニークな値になるので、ユニークキー (UNIQUE KEY) 制約を指定しておきます。

CREATE TABLE students (
    student_id      INT             NOT NULL AUTO_INCREMENT,
    student_number  VARCHAR(10)     NOT NULL,
    first_name      VARCHAR(50)     NOT NULL,
    last_name       VARCHAR(50)     NOT NULL,
    middle_name     VARCHAR(50)     NULL,
	birthday  	    DATE            NOT NULL,
    gender          ENUM ('M','F')  NOT NULL,
    paid_flag       BOOL            NOT NULL,
    PRIMARY KEY (student_id),
    UNIQUE KEY (student_number)
);

CREATE TABLE でチェック (CHECK) 制約を指定する

カラムに入る値にルールがある場合はチェック (CHECK) 制約をつけておくと良いと思います。

チェック制約がついていると、チェック制約に合わない値を入れようとするとエラーになり、想定していないデータが保存されるのを防ぐことができます。


CREATE TABLE でチェック制約を指定するには CHECK キーワードを使います。

主キーと同様に、カラムの定義に続けて指定してもいいですし、別の行にしてカラム名を指定しても大丈夫です。

CREATE TABLE テーブル名 (
    カラム名1 データ型 [NOT NULL | NULL],
    カラム名2 データ型 [NOT NULL | NULL],
    カラム名3 データ型 [NOT NULL | NULL] CHECK (チェック式),
    ....
);
CREATE TABLE テーブル名 (
    カラム名1 データ型 [NOT NULL | NULL],
    カラム名2 データ型 [NOT NULL | NULL],
    カラム名3 データ型 [NOT NULL | NULL],
    ....
    CHECK (チェック式)
);

例えば、students テーブルの birthday カラムに入る値を 2000 年 1 月 1 日以降としたい場合は、次のようにチェック制約を指定することができます。

CREATE TABLE students (
    student_id      INT             NOT NULL AUTO_INCREMENT,
    student_number  VARCHAR(10)     NOT NULL,
    first_name      VARCHAR(50)     NOT NULL,
    last_name       VARCHAR(50)     NOT NULL,
    middle_name     VARCHAR(50)     NULL,
	birthday  	    DATE            NOT NULL,
    gender          ENUM ('M','F')  NOT NULL,
    paid_flag       BOOL            NOT NULL,
    PRIMARY KEY (student_id),
    UNIQUE KEY (student_number),
    CHECK (birthday >= '2000-01-01')
);

CREATE TABLE でカラムにデフォルト値を指定する

テーブルにデータを挿入する際に値を指定しなかった時に入るデフォルトの値を指定しておくことができます。

CREATE TABLE でカラムにデフォルト値を指定するには DEFAULT キーワードを使います。

カラムの定義に続けて、DEFAULT デフォルト値のように指定します。

CREATE TABLE テーブル名 (
    カラム名1 データ型 [NOT NULL | NULL],
    カラム名2 データ型 [NOT NULL | NULL],
    カラム名3 データ型 [NOT NULL | NULL] DEFAULT デフォルト値,
    ....
);

例えば、students テーブルの paid_flag カラムのデフォルト値を FALSE (0) にしたい時は次のように指定することができます。

FALSE は MySQL のブーリアンリテラルで 0 のことなので、DEFAULT 0 でも大丈夫です。

CREATE TABLE students (
    student_id      INT             NOT NULL AUTO_INCREMENT,
    student_number  VARCHAR(10)     NOT NULL,
    first_name      VARCHAR(50)     NOT NULL,
    last_name       VARCHAR(50)     NOT NULL,
    middle_name     VARCHAR(50)     NULL,
	birthday  	    DATE            NOT NULL,
    gender          ENUM ('M','F')  NOT NULL,
    paid_flag       BOOL            NOT NULL DEFAULT FALSE,
    PRIMARY KEY (student_id),
    UNIQUE KEY (student_number),
    CHECK (birthday >= '2000-01-01')
);

CREATE TABLE で外部キー (FOREIGN KEY) 制約を指定する

テーブルのカラムの値を、他のテーブルのあるカラムに存在している値のみに制限したい場合、外部キー(FOREIGN KEY) 制約をつけます。

CREATE TABLE でチェック制約を指定するには FOREIGN KEYREFERENCES というキーワードを使います。

カラムの定義に続ける場合は、定義に続けて次のように参照する他のテーブル名とカラム名を指定します。

CREATE TABLE テーブル名 (
    カラム名1 データ型 [NOT NULL | NULL],
    カラム名2 データ型 [NOT NULL | NULL],
    カラム名3 データ型 [NOT NULL | NULL] REFERENCES 他のテーブル名 (他のテーブルのカラム名),
    ....
);

別の行で外部キーを指定する場合は FOREIGN KEY (そのテーブルのカラム名) REFERENCES 他のテーブル名 (他のテーブルのカラム名) のように指定します。

CREATE TABLE テーブル名 (
    カラム名1 データ型 [NOT NULL | NULL],
    カラム名2 データ型 [NOT NULL | NULL],
    カラム名3 データ型 [NOT NULL | NULL],
    ....
    FOREIGN KEY (そのテーブルのカラム名) REFERENCES 他のテーブル名 (他のテーブルのカラム名)
);

例えば、追加でコースの情報を保持する courses テーブルと、どの生徒がどのコースをとっているかを保持する student_courses テーブルを定義します。

student_courses テーブルの student_id には、students テーブルの student_id にある値、course_id には courses テーブルの course_id にある値しか入って欲しくないので、外部キー制約を追加します。

CREATE TABLE students (
    student_id      INT             NOT NULL AUTO_INCREMENT,
    student_number  VARCHAR(10)     NOT NULL,
    first_name      VARCHAR(50)     NOT NULL,
    last_name       VARCHAR(50)     NOT NULL,
    middle_name     VARCHAR(50)     NULL,
	birthday  	    DATE            NOT NULL,
    gender          ENUM ('M','F')  NOT NULL,
    paid_flag       BOOL            NOT NULL DEFAULT FALSE,
    PRIMARY KEY (student_id),
    UNIQUE KEY (student_number),
    CHECK (birthday >= '2000-01-01')
);

CREATE TABLE courses (
	course_id 	INT         NOT NULL AUTO_INCREMENT,
    course_name VARCHAR(20)	NOT NULL,
    PRIMARY KEY (course_id)
);

CREATE TABLE student_courses (
    student_id	INT NOT NULL,
    course_id	INT NOT NULL,
	PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students (student_id),
	FOREIGN KEY (course_id) REFERENCES courses (course_id)
);

このスクリプトを実行すると次のようになりテーブルが三つ生成されました。

MySQL でテーブルの作成 (CREATE TABLE) 1

今回それぞれ制約名は省略しているので、名前は MySQL が自動的につけますが、制約の定義の最初に「CONSTRAINT 制約名」と追加することで、制約名を指定することもできます。


以上、MySQL でテーブルを作成する方法をご説明しました。

© 2024 MySQL 入門