MySQL のデータベース・テーブルの作成 (CREATE/DROP)
データベースに関する基礎知識
念のため、データベースが扱うデータ構造について少し触れておこうかと思います。データベースについて詳しい人は、読み飛ばしていただいてけっこうです。というか、この記事自体、データベースに詳しい人には無用の長物かもしれませんが(^^ゞ
MySQL をはじめとする一般的なデータベースは、「テーブル」と呼ばれる構造ですべてのデータを管理します。テーブルは、ある一定の構造をもったデータの集合体です。C 言語を知っているなら、構造体配列のようなものと考えると良いかもしれません。例えば、以下は簡単なリンク集のテーブルです。
ID(整数) | SITENAME(文字列) | URL(文字列) |
---|---|---|
1 | Livedoor | http://www.livedoor.com/ |
2 | http&$58;//www.google.co.jp/ | |
3 | Yahoo! | http://www.yahoo.co.jp/ |
横の列が「レコード」、縦の列が「カラム」、もしくは「フィールド」と呼ばれます。
まず明白な点として、各カラムはそれぞれ名前とデータ型を持っています。各カラムに名前があることで特定のカラムだけ問い合わせたり、演算を施したりといったことが可能になります。また、整数型である一番左のカラムに文字列を保存することはできませんし、2 番目のカラムに数値を保存することも(文字列に変換しない限り)できません。それに対して、レコードは明示的な名前などは持っていません。これは、レコードは自由に挿入・削除をする必要があるので、そのたびにユニークな名前を付けることを強制するのは現実的ではないからです。
上記のリンク集をはじめとして、アドレス帳や顧客名簿、商品情報、時刻表、売り上げ帳簿などなど、世の中のデータの大部分が多かれ少なかれ上記の構造を持っています。このような性質をもつデータ構造を保持し、レコードの追加・削除、データの問い合わせなどの機能を効率的に提供するのがMySQL などの RDBMS の役割だと考えておけばよいと思います。実際にはテーブル間のリレーションや制約など、さらに高度な機能もありますが、今回の内容ではそこまで深いところには触れません。まずは上記のイメージで捉えておいてください。
そうそう、テーブルは上記のイメージでよいとして、それとは別に「データベース」という概念があります。紛らわしいですが、MySQL 自身のことではありません。データベースは、主に権限や名前空間を分割するために使用されます。例えば、ひとつの MySQL サーバーに複数の Web アプリケーションのデータを保存する場合、それぞれの Web アプリケーションでテーブル名が重複する可能性があります。また、あるアプリケーションから別のアプリケーションのテーブルを参照・変更できるのは、セキュリティーの面からも好ましくないと思います。こんなときに、それぞれのアプリケーションごとに別々のデータベースを作っておけば、テーブルの名前が重複しても別のものとして扱えますし、別のアプリケーションが使うデータベースへのアクセスを簡単に禁止できます。そのようなわけで、MySQL では最初にデータベースを作成し、テーブルは必ずいずれかのデータベースに所属する形で作成するようになっています。
データベース
では、さっそくデータベースのほうからいってみましょう。
作成
データベースの作成は簡単です。CREATE DATABASE ステートメントを使用します。
CREATE DATABASE [IF NOT EXISTS] <データベース名>;
- IF NOT EXISTS
- これを指定した場合、作成しようとしたデータベースが既に存在する場合もエラーを出さずに正常終了します。中身はともかくデータベースの存在を保証したい場合に便利です。
- データベース名
- 作成するデータベースの名前です。半角 64 文字以内で、'/', '\', '.' を除くディレクトリ名に使用可能な文字で指定します。
削除
データベースの削除には DROP DATABASE ステートメントを使用します。
DROP DATABASE [IF EXISTS] <データベース名>;
- IF NOT EXISTS
- これを指定した場合、作成しようとしたデータベースが存在しない場合もエラーを出さずに正常終了します。
- データベース名
- 削除するデータベースの名前です。
削除するデータベース内にテーブルが存在した場合、それらは自動的に削除されます。
情報の取得
存在するデータベースの名前を確認するには、以下のコマンドを実行します。
SHOW DATABASES;
テーブル
次はテーブルです。テーブルは実際のデータ構造を規定するものですので、データベースに比べて若干複雑になります。
作成
テーブルの作成は CREATE TABLE ステートメントで行います。構文はかなり複雑なので、ここでは主に使う機能だけをご紹介します。完全な情報はリファレンスマニュアルをご覧ください。
CREATE TABLE [IF NOT EXISTS] [<データベース名>.]<テーブル名> ([カラム定義]);
- IF NOT EXISTS
- これを指定した場合、作成しようとしたテーブルが既に存在する場合もエラーを出さずに正常終了します。テーブルの構造が違う場合でもエラーになりませんので注意してください。
- データベース名
- テーブルを作成するデータベースを指定します。省略した場合は USE ステートメントで指定されたカレントのデータベースが使用されます。
- テーブル名
- 作成するテーブル名です。半角 64 文字以内で、'/' と '.' を除くファイル名に使用可能な文字で指定します。
- カラム定義
- テーブルの各カラムの名前と型などを指定します(後述)。省略した場合は空のテーブルが作成されます。
カラム定義は以下のような定義をコンマ区切りで複数並べたものです。
<カラム名> <型> [DEFAULT <デフォルト値>] [AUTO_INCREMENT] [PRIMARY KEY]
- カラム名
- カラムの名前を指定します。64 文字以内で自由に指定できます。
- 型
- カラムに格納するデータの型を指定します(後述)。
- デフォルト値
- 値が指定されなかった場合のデフォルト値を指定します。AUTO_INCREMENT とは一緒に指定できません。
- AUTO_INCREMENT
- テーブルの中でひとつの整数型のカラムにのみ指定できる。このカラムに NULL か 0 を挿入すると、自動的に最大値 + 1 の値が設定される。
- PRIMARY KEY
- 主に個々のレコードを識別する重複のない ID として使用するカラムに指定する。テーブルの中でひとつのカラムにしか指定できない。これを指定したカラムには自動的にインデックスが作成されるので、高速な検索が行える。
主に使用される型は以下のとおりです。
型名 | 格納可能な値 |
---|---|
TINYINT | 8bit 符号付き整数 |
TINYINT UNSIGNED | 8bit 符号なし整数 |
INT | 32bit 符号付き整数 |
INT UNSIGNED | 32bit 符号なし整数 |
FLOAT | 単精度(32bit)浮動小数点数 |
DOUBLE | 倍精度(64bit)浮動小数点数 |
DATE | 日付(YYYY-MM-DD 形式) |
DATETIME | 日付と時刻(YYYY-MM-DD HH:MM:SS 形式) |
TIME | 時刻(HH:MM:SS 形式) |
VARCHAR(M) | 最大 M 文字の可変長文字列 |
TEXT | 最大 65,535 文字の可変長文字列 |
BLOB | 最大 65,535byte のバイナリデータ |
ENUM('value1', 'value2'...) | 指定した値のうちいずれかひとつを持つ列挙型 |
SET('value1', 'value2'...) | 指定した値のセットを保持する |
完全な情報は リファレンスマニュアルを参照してください。
削除
テーブルの削除は、DROP TABLE ステートメントを使って行います。 書式は以下のとおりです。
DROP TABLE [IF EXISTS] [<データベース名>.]<テーブル名>;
- IF EXISTS
- これを指定した場合、作成しようとしたテーブルが存在しない場合もエラーを出さずに正常終了します。
- データベース名
- 削除するテーブルが所属するデータベースを指定します。省略した場合は USE ステートメントで指定されたカレントのデータベースが使用されます。
- テーブル名
- 削除するテーブル名です。
完全な情報はリファレンスマニュアルをご覧ください。
テーブルの情報の取得
指定のデータベース内に存在するテーブルを確認するには、以下のコマンドを使用します。
SHOW TABLES FROM <データベース名>;
また、特定のテーブルのカラム構造を確認したい場合は、以下のコマンドです。
DESCRIBE [<データベース名>.]<テーブル名>
以上、今回はデータベース・テーブルの作成・削除に関して書いてみました。とくにテーブルの作成は非常に奥が深いのでまったく説明しきれていませんが、Web アプリケーションを使うための基礎知識としてはじゅうぶんではないでしょうか。あとは、使いながら少しずつ覚えていけばよいと思います。私も含めて(^^;
詳しくはこちらの記事をどうぞ!
この記事にコメントする