MySQLでテーブルを作成する流れを説明していきます。5月31日記事
目次
最初は新着情報を管理するテーブルを作っていきます。
そんなに新着時間を表示させるほどの情報はないので、日付のみにするとします。すると、記事ID、日付(時間なし)、タイトル、内容属性、本文、URL、ステータスというところでしょうか。ステータスは、投稿状態を表すもので公開(2)、下書き(1)、削除(0)といったものを格納していきます。
ログインします。
mysql -u ユーザ名 -pユーザパスワード
これでログインします。
ログイン後 use データベース名;
と入力します。
informationというテーブルを作っていきます。
CREATE TABLE information( id INT NOT NULL AUTO_INCREMENT, info_date DATE NOT NULL default '0000-00-00', title VARCHAR(255) NOT NULL default '', type TINYINT(1) NOT NULL default '0', info_text TEXT NOT NULL default '', url VARCHAR(255) NOT NULL default '', status TINYINT(1) NOT NULL default '0', PRIMARY KEY (`id`), INDEX `info_date` (`info_date`), INDEX `status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;
※削除は mysql> DROP TABLE information;
です。
主キーは記事IDです。INDEXは公開日付、ステータスに張っていきます。データベースで検索するときに、最新5件の記事+ステータスが2の状態の記事を検索するクエリを投げれば5件のデータを取得できるようにしておきます。ステータスのINDEXはこれ以外にも現在の更新情報数を数えるためにも必要なものです。
MySQLにはテーブルの種類の違いがあります。俗にストレージエンジンと呼ばれ、InnoDBとMyISAMというものが有名です。前まではMyISAMがよく使われていましたが、ここ最近InnoDBを使っていこうという風潮があります。MySQLのバージョン5.5以降では、InnoDBがデフォルトになっています。特に指定がない限り、何も記述しないかInnoDBを指定するようにしましょう。データベースは、テーブルのデータを更新、変更した際に、他のテーブルも同時に更新することを求められる場合があります。その際に、何らかのトラブルがあった時に、処理を一度取り消し、再び行うことが求められます。InnoDBがそれができるのです。
MyISAM | InnoDB | |
概要 | テーブルに対してロック | レコードに対してロック |
長所 | マシンへの負担が少ない | 異なるレコードの場合同時に処理できる。処理が早い |
短所 | 異なるレコードの処理を同時にできない。 | 昔は全文検索ができなかった。 |
利用 | 数少ない更新であれば有利 | 様々なユーザが使う場合に有利 |
データベースはデータとなる情報(レコード)が増えてこれば検索や管理が大変になります。データベースはExcelのように
何もせずに
データを早く検索できたりソートかけれるものではありません。データベースは、主キーやINDEXを
自らつけて
処理を早くしていく設計をしていかなければなりません。
違いについては主キーは値が一つしかつかないもの。インデックスは検索を早くするものです。
http://www.nishi2002.com/4002.htmlには
主キー --- 行を識別するもの(口座番号、生徒番号、社員番号などの役割)
インデックス --- 検索を速くするもの(書籍の巻末にある索引の役割)
と書かれています。もちろん主キーも検索するときに利用されたりしますしインデックスがつけられています。
また、主キーにはPrimaryKeyというものがつけられ、重複する値は格納されないという性質を持ちます。最初にテーブルのデータが入る行(レコード)に一つずつつけられていきます。
イメージとしては本のページ数です。
一方、インデックスとは、本の索引のような機能です。本はページ数だけで成り立ちますが、より早く本の情報を検索するためには巻頭や巻末に索引機能を設け検索を高速にしています。
そして、これらを列(カラム)にどうつけていくかは設計者やテーブル作成者が決めていかなければなりません。
一見、全部にINDEXつければいいのに。と思う人もいるかもしれませんが、情報量が無駄に多くなったりします。やはり
自分の意図した検索だけをさせ処理や検索を高速化させる構想を頭の中で考えながらテーブル設計していくことが求められます。
データベースのフィールドに入れられる文字または数字には文字数やバイト数や文字数の上限と下限が決められています。どんな値でも入れられるとは限りません。ここでは、その型の種類と上限や下限についてまとめていきたいと思います。
数値の型については以下の通りです。数値はどのような数値でも格納できるわけではありません。入れられる数値には範囲があります。わからなければ
最初はINT型だけ
覚えておけばいいと思います。
型 | 最小値 | 最大値 | サイズ |
TINYINT | -128 | 127 | 1バイト |
TINYINT UNSIGNED | 0 | 255 | 1バイト |
SMALLINT | -32768 | 32767 | 2バイト |
SMALLINT UNSIGNED | 0 | 65535 | 2バイト |
MEDIUMINT | -8388608 | 8388607 | 3バイト |
MEDIUMINT UNSIGNED | 0 | 16777215 | 3バイト |
INT | -2147483648 | 2147483647 | 4バイト |
INT UNSIGNED | 0 | 4294967295 | 4バイト |
BIGINT | -9223372036854775808 | 9223372036854775807 | 8バイト |
BIGINT UNSIGNED | 0 | 18446744073709551615 | 8バイト |
FLOAT | -3.402823466E+38 | 3.402823466E+38 | 4バイト |
FLOAT UNSIGNED | 0 | 3.402823466E+38 | 4バイト |
DOUBLE | -1.7976931348623157E+308 | 1.7976931348623157E+308 | 8バイト |
DOUBLE UNSIGNED | 0 | 1.7976931348623157E+308 | 8バイト |
文字データ型
型 | 説明 | カッコ内 | バイト数 | 特徴 |
VARCHAR | 可変長文字列 | 最大バイト数を指定 | 0~65535バイト | 最大バイト数は決まるが小さい場合は変化 |
CHAR | 固定長文字列 | 文字数を指定 | 0~255文字 | 常に文字数固定。処理が早くなり軽い |
TEXT | 可変長文字列 | 65,535バイト | 文章等がよく挿入される | |
MEDIUMTEXT | 可変長文字列 | 16,777,215バイト |
日付型
型 | 日付形式 | 有効範囲 | バイト数 |
DATE | YYYY-MM-DD | '1000-01-01' ~ '9999-12-31' | 3バイト |
DATETIME | YYYY-MM-DD HH:MM:SS | '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59' | 8バイト |
TIMESTAMP | 'YYYY-MM-DD HH:MM:SS' | '1970-01-01 00:00:00' ~ '2037-12-31 23:59:59' | 4バイト |
TIME | HH:MM:SS | '-838:59:59' ~ '838:59:59' | 3バイト |
次回はテーブル作成後の意味や操作についてMySQLでテーブル作成2を書いていきたいと思います。