皆さんMySQL使ってますか?今回はCREATE TABLE文を使ってテーブルを作成する方法をお伝えします。テーブルといえばリレーショナルデータベースの肝の部分。
ですが、作成自体はそこまで難しいものではありません。さっくり理解して、学習を進めていきましょう!
テーブルを作る:CREATE TABLE文
まずはテーブルの作り方についてです。テーブルを作るにはCREATE TABLE文を使います。CREATE TABLE文の書式は次のようになります。
カラムの名前1 データ型 オプション,
カラムの名前2 データ型 オプション,
……
全体向けのオプション
);
なお、テーブルを作成する場合、作成したいデータベースにUSEを使って入っていると思いますが、データベース外部から作成したい場合はデータベース名.テーブル名とすることで作成可能です。では実際に動かしてみましょう。
CREATE DATABASE createtb_db; USE createtb_db; CREATE TABLE name_age_list( id INT(11) AUTO_INCREMENT NOT NULL, name VARCHAR(30) NOT NULL , age INT(3) NOT NULL, PRIMARY KEY (id)); DESC name_age_list;
実行結果
+-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(30) | NO | | NULL | | | age | int(3) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec)
ここまでは問題なくできたでしょうか。もしデータベースの作成や他のコマンドがわからない場合は次の記事を確認しておいてください。データベースとは、といった基礎的な内容も復習できます。
データ型について
この章ではデータ型について見ていきましょう。データ型はMySQL以外にプログラミング言語を学習した経験のある方にはある程度馴染みがあるかもしれませんね。データ型とはカラムに入れることができるデータの属性を制限するための機能です。
DESC文を実行した上の表を見ると、Typeというカラムがデータ型に対応します。なぜデータ型を設定するかというと、次の2点が上げられます。
- 型を制限することでメモリ上の領域を確保しやすくするというプログラミング的な側面
- 型を制限することで誤ったデータを入力できなくするデータベース的な側面
データベース的に考えるならば理由2の方がより重要です。たとえばidというカラムに「yamada」というデータが入っていた場合、おそらくは何かの名前が誤って入力されてしまったことが考えられます。
データ型を指定しておけば、idカラムには数字しか入れることができないため、未然にこういったミスを防ぐことが可能です。では具体的なデータ型を見ていきましょう。
数値型
- INT
基本的な整数型。-2147483648から2147483647までの値を取ることができます。おおよそ+-21億ほどあるので、多くの場合INTで事足りるケースが多くなってきているのでは無いでしょうか。
整数型は他に
- TINYINT
- SMALLINT
- MEDIUMINT
- BIGINT
があります。MEDIUMINTが+-8388607(約838万)、BIGINTが+-9223372036854775807(約922京)なのでとても大きな数字を扱う際はBIGINTとおぼえておけば十分ではないかと思います。
- FLOAT
単精度の浮動小数点数型。4バイトの浮動小数点数でおよそ-3.402823466E+38 から -1.175494351E-38 、1.175494351E-38 から 3.402823466E+38の値をとります。8バイトに拡張された倍精度浮動小数点数型のDOUBLEもあります。
- DECIMAL
固定小数点型。DECIMAL(最大桁数,小数点以下の桁数)の形で記述されます。DECIMAL(5,2)の用に書き、この場合、-999.99 から 999.99 の範囲を表します。最大桁数は65、小数点以下の桁数は30まで指定可能です。
DECIMAL型は浮動小数点数で発生する誤差が生じないため、誤差の発生が許されない金銭データなどで使用されます。
文字列型
- VARCHAR
可変長文字列型。255文字を超えない文字列には基本的にこちらを用います。後ろにかっこ(数字)をつけることで文字数を制限することができます。これは他のデータ型でも使えるので、覚えておくと良いでしょう。
他にCHAR型がありますが、こちらの場合、文字数が(数字)以下のときは文字列の後ろにスペースを加えて(数字)に等しくなるまで拡張していきます。VARCHARはそういった挙動をせず、入力された文字を素直に格納します。
- TEXT
長い文字列型。65535文字まで入力することができます。更に長い文字列を格納する必要がある場合はLONGTEXT型(4294967295文字まで)があります。
日付・時刻型
- DATETIME
日付・時刻型。日付と時刻の両方に対応した型です。範囲は’1000-01-01 00:00:00.000000′ から ‘9999-12-31 23:59:59.999999’ で書き方は「2018-12-18 15:35」といった風になります。
2桁の数字で年を表すことも可能で、次のルールによって西暦に変換されます。
- 00-69 の範囲の値は 2000-2069 に変換されます。
- 70-99 の範囲の値は 1970-1999 に変換されます。
引用元:Oracle https://dev.mysql.com/doc/refman/5.6/ja/datetime.html
ただし、曖昧さが残ること、ルールをまたぐときに不具合の原因になりうることから、長期に運用する予定のデータベースはちゃんと4桁の西暦で表記することをおすすめします。
この他に日付のみのDATE型、年のみのYEAR型、時刻のみのTIME型がそれぞれあります。より深いデータ型の知識を得たい方は公式リファレンスを参照するといいでしょう。
参照:Oracle https://dev.mysql.com/doc/refman/5.6/ja/data-types.html
指定可能なオプションについて
この章ではCREATE TABLE文で使用可能なオプションについて紹介していきます。
NOT NULL
NOT NULLを指定したカラムではnull値が許されなくなります。デフォルトの値を設定していない場合、データ挿入時の未記入部分はnullになるので、結果としては未記入部分のあるデータ挿入はエラーとして弾かれるようになります。
一見ただ不便になるだけのオプションですが、極力すべてのカラムにNOT NULLは設定すべきです。nullは一見便利そうに見えて、非常に厄介な存在なのです。興味のある方は「3値論理」で検索してみましょう。
もしくはNOT NULL制約を一切かけないデータベースを作ってみて、実際どツボにハマるのもいい経験かもしれません。
AUTO_INCREMENT
AUTO_INCREMENTを設定したカラムでは数値が連番で入力されるようになります。IDや会員番号など、連続した数値が欲しいときによく使われますね。
DEFAULT
DEFAULTはカラムのデフォルト値を設定します。書式としてはDEFAULT デフォルト値, という書き方になります。名前に対して「氏名未入力」などと使うケースがあります。
PRIMARY KEY
PRIMARY KEYは指定したカラムを主キーに設定します。主キーについては以下の記事を参照してください。
PRIMARY KEYはカラムのオプションとして使うこともできますし、CREATE TABLEの最後に全体向けのオプションとして設定することもできます。その場合の書式は次のようになります。
id INT(11) AUTO_INCREMENT NOT NULL,
……
PRIMARY KEY (id));
PRIMARY KEYは同時にNOT NULLオプションの設定が必要になります。こちらも合わせて覚えておきましょう。
UNIQUE
UNIQUEはユニークキーを設定することができるオプションです。ユニークキーはレコード間の重複が許されなくなる制約ですが、主キーと違い、nullは許容されます。
name VARCHAR(30) UNIQUE ,
……
);
このようにユニークキーの制約をかけると、名前に対して重複が許されなくなります。ここまでで紹介してきたオプションはDESC テーブル名;でカラムごとに確認できますので、逐次確認してみるといいでしょう。
まとめ
いかがでしたか?今回はテーブルの作り方について、CREATE TABLEの基本書式から、データ型、オプションまでを紹介してきました。冒頭にも書きましたが、テーブルこそがリレーショナルデータベースの核心です。
その割には作ること自体はそこまで難しいものではなかったのではないでしょうか。一歩一歩知識を深めて学習を進めていきましょう。この記事が皆様のMySQL学習の一助となれば幸いです。