2.4 テーブルの理解と作成

 本節では、MariaDB内で実際にデータを管理するテーブルの、基本的な概念と作成方法について学習します。

2.4.1 テーブルとは

 テーブルとは、実際にデータを格納する入れ物です。Microsoft Excelに例えると、ワークブックがデータベースだとすると、ワークシートがテーブルに当たります。

 Microsoft Excelでもワークシートがないとデータを入力することができないのと同じで、実際にデータを格納するには、まずテーブルを作成しておく必要があります。

図 2.4.1 MariaDBの構造

2.4.2 テーブル作成の準備

 テーブルを作成するには、事前に決めておかなくてはならない項目があります。

① テーブル名

 データを格納するテーブルの名前です。日本語も使えますが、アルファベットと「_」(アンダースコア)を組み合わせて命名するのが一般的です。

② 列名(フィールド名)

 データを格納する各列の名前です。テーブル名と同様に、日本語も使えますがアルファベットと「_」(アンダースコア)を組み合わせて命名するのが一般的です。

③ 列のデータ型

 各列に格納するデータの型です。テーブルでは、各列に格納するデータをあらかじめ決めておく必要があり、一度決めたらそれ以外の型のデータは入れられない仕様になっています。

 MySQLで使用できる列の型のうち、よく利用されるデータ型には次のようなものがあります。

表 2.4.1 : よく利用されるMariaDBのデータ型

 整数型や文字列型は列の型を決定すると共に、扱えるデータの桁数を指定することも可能です。

 桁数を指定するための書式は次のようになります。

書式:桁数の指定

 例えば、「INT型」の「price」という名前の列で扱える桁数を「10桁」とする場合、次のコマンドをテーブル作成時に実行することになります。

④ 列の属性

 列の属性は必須ではありませんが、実際の開発現場では列に属性を付けることがほとんどです。列の属性には以下の表のようなものがあり、一番重要なのが主キー(プライマリキー)です。

 主キーとは、そのテーブルの中で1つのデータを特定する列の属性のことです。主キーを設定することで膨大なデータの中から、必要な行のデータだけを確実に取り出すことができるようにします。

表 2.4.2 : 列の属性

 属性を指定する場合は、列名、型名の後ろに属性を指定します。

書式:属性の指定

 例えば、「VARCHAR型」の「isbn」という名前の列を主キーに設定する場合、次のコマンドをテーブル作成時に実行することになります。

 大規模なプログラムになった場合、テーブルの設計によっては問題が発生する場合もあるため、テーブルの定義については慎重に検討する必要があります。

2.4.3 SQLのデータ型

 「2.4.2テーブル作成の準備」で紹介した以外にも、MariaDBには様々な型があります。

 本項で紹介されている型を全て覚える必要はありませんが、どのような型が存在するか大まかに知っておきましょう。

表 2.4.3 : 整数型と浮動小数点型

 整数型と浮動小数点型はそれぞれ管理できるデータ量が異なります。

 また、浮動小数点型については、その列で管理できる全体の桁数と小数点以下の桁数を指定することもできます。桁数を指定するための書式は次のようになります。

書式:小数点以下の桁数の指定

 例えば、「DOUBLE型」の「price」という名前の列で扱える桁数を「全体が5桁、小数点以下が2桁」とする場合、次のコマンドをテーブル作成時に実行することになります。

 この列に格納できる値は、整数部分が0~999までの1~3桁になり、小数点以下が00から99までの2桁で固定される形になります。

表 2.4.4 :文字列型

 CHAR型と「2.4.2テーブル作成の準備」で紹介したVARCHAR型は同じ文字列型ですが、CHAR型は「固定長」、VARCHAR型は「可変長」と呼ばれ、データの格納される形式が異なります。

 CHAR型の列に、指定サイズに満たない文字データを格納した場合、不足したサイズ分のデータをスペースで埋めて格納されます。例えば「CHAR(10)」と定義された列に「ABC」という文字列を格納した場合、10桁の「ABC␣␣␣␣␣␣␣」(␣はスペース)という文字列として格納されることになります。

 一方、VARCHAR型の列は、指定サイズに満たない文字データを格納したとしても、不足したサイズ分のデータをスペースで埋めることはありません。「VARCHAR(10)」と定義された列に「ABC」という文字列を格納した場合でも、3桁の「ABC」という文字列として格納されます。

 なお、CHAR型の列でデータの比較や取得する場合には、末尾のスペースは全て自動的に削除されます。そのため、スペースが何個ついているかなど特に気にする必要はありません。

表 2.4.5 : 日付時刻型

表 2.4.6 : BINARY型とVARBINARY型

 BINARY型とVARBINARY型はデータをバイナリデータ(画像、動画、音声など、文字データ以外のデータ)として格納します。どちらのデータ型も文字セットなどはなく、送られてきたデータをそのままバイナリデータとして格納します。

表 2.4.7 : BLOB型

 BLOB型はバイナリデータを扱うデータ型で格納できるデータのサイズを指定しません。巨大なバイナリデータを格納する時に利用されます。

表 2.4.8 : TEXT型

 TEXT型は文字列データを扱うデータ型で格納できるデータのサイズを指定しません。巨大なテキストデータを格納する時に利用されます。

2.4.4 主キーと複合主キー

 主キーとは、そのテーブルの中で1つのデータを特定する列の属性のことです。主キーを設定することで膨大なデータの中から、必要な行のデータだけを確実に取り出すことができるようにします。

 下の社員情報テーブルの例を見てみましょう。社員の情報を格納するテーブルを作成した場合、名前だけではデータを特定することができない場合があります。

図 2.4.2 社員を特定できない社員情報テーブルの例

 このような場合には、社員番号のような値が重複しないユニークな列を作ることでデータを特定することができるようになります。

図 2.4.3 主キーを使って社員を特定できる社員情報テーブルの例

 このテーブルの場合、社員番号の列が主キーになります。

主キーのルール

 ・ 主キーは必ずユニークな値とする。

 ・ 主キーには空のデータは格納できない。

 社員情報テーブルの例では社員番号のみを主キーとしていましたが、実際の主キーは1つの列とは限らず、2つ以上の列を組み合わせてデータを特定する場合もあります。このような2つ以上の列を組み合わせた主キーを複合主キー(連結キー)と呼びます。

 複合主キーについて、主キーの学習で取り上げた社員情報テーブルの例を見てみましょう。

 もし、グループ内の企業で同じ社員番号の体系を持っていると、グループ全体で見たときに社員番号だけではデータを特定できないことになります。社員番号「10001」の社員情報を確認したい場合、どの企業の社員番号「10001」なのかが特定できなくなります。

図 2.4.4 社員を特定できない社員情報テーブルの例2

 このような場合には、企業コードをテーブルに追加し、企業コード+社員番号を主キーとすることで、データを特定することができるようになります。

図 2.4.5 複合主キーを使って社員を特定できる社員情報テーブルの例

 主キーはリレーショナルデータベースでは大変重要な概念です。テーブルには必ず主キーを設定するようにしましょう。

 次の項では、実際にテーブルの作成方法について学習します。

2.4.5 テーブルの作成

 それでは実際にテーブルを作っていきましょう。

 テーブルは、「mybookdb」に作成していきます。「bms」ユーザーでログインし、「USE」コマンドで「mybookdb」を選択して下さい。

 作業を行うデータベースを選択するための書式は次のようになります。

書式:データベースの選択

 「myboookdb」データベースを選択する場合に次のコマンドを実行します。

図 2.4.6 :「mybookdb」データベースの選択

「;(セミコロン)」と「USE」コマンド

 今まで利用してきたSQL文には文の最後に「;(セミコロン)」をつけていました。しかし、データベースを選択する際に利用する「USE」コマンドにはセミコロンをつけません。

 MariaDBで利用するコマンドにはMySQLそのものに命令するコマンドとデータを操作するSQL文の二種類があり、セミコロンはSQL文の最後につける決まりになっています。

 なお、MariaDBに命令するコマンドに「;(セミコロン)」をつけても問題はありませんが、セミコロンをつけない書き方が、本来の書き方になっています。

 これから以下のテーブルを作成していきます。

表 2.4.9 : 「bookinfo」テーブル

 テーブルを作成するには、「CREATE TABLE」文を使用します。

 「CREATE TABLE」文の構文は次の通りです。

書式:テーブルの作成

 「bookinfo」テーブルを作成する場合に次のコマンドを実行します。

 属性を設定しない列は、属性の記述を省略することができます。

 それでは実際にコマンドを実行してみましょう。

図 2.4.7 :「bookinfo」テーブルの作成

 コマンドを実行したらテーブルが作成されているか確認します。現在のテーブルを確認するには、「SHOW TABLES」コマンドを利用します。「SHOW」キーワードはデータベースの確認を行ったものと同じです。今回はテーブルを確認するため、「SHOW」キーワードの後ろに「TABLES」キーワードがつきます。

図 2.4.8 : テーブルの確認

 「bookinfo」テーブルが作成されているのが確認できます。

 さらに作成したテーブルの詳細を確認するには、「SHOW FIELDS」コマンドを使用します。

 構文は下記の通りです。

書式:テーブル詳細の確認

 「SHOW」キーワードはデータベースやテーブルを確認したものと同じです。

 今回のコマンドでは、テーブル内の列(フィールド)の情報を詳しく表示するため「FIELDS」をつけます。また、データベース内には複数のテーブルが存在するため、「FROM テーブル名」をつけることで、どのテーブルの詳細を確認するのかを示しています。

 「bookinfo」テーブルの詳細を確認する場合には、次のコマンドを実行します。

図 2.4.9 : テーブル詳細の確認

 「SHOW FIELDS」コマンドで表示された項目は次の情報を表しています。

表 2.4.10 : 「SHOW FIELDS」で表示される情報

テーブルの削除

 テーブルを削除する場合には、「DROP TABLE」文を使用します。

 先ほど作成した「bookinfo」を削除する場合には、「DROP TABLE bookinfo;」とコマンドを入力します。但し、テーブルを削除してしまうと、そのテーブルの中で管理されたデータも削除され、元に戻すことができませんので注意が必要です。

 なお、本テキストではテーブルの削除は行いません。「bookinfo」テーブルは今後の学習で利用するテーブルになりますので、もし削除を行う場合には、削除後に再度「bookinfo」テーブルを作成して下さい。

 本書では単一の列を主キーとするテーブルを作成しましたが、複数の列を主キーとするテーブルを作成する場合には、「CREATE TABLE」コマンドの書式が異なります。仮に、「bookinfo」テーブルの主キーをISBN番号とタイトルに設定したテーブルを作成する場合、以下のようなコマンドを実行するとエラーになってしまいます。

図 2.4.10 : 複合主キーの作成(エラー)

 主キーを複数の行に設定したい場合には、以下の「CREATE TABLE」コマンドを利用して下さい。

図 2.4.11 : 複合主キーの作成(成功)

 各列の定義に主キーの属性をつけるのではなく、各列を定義した後で、どの列を主キーに指定するのかを記述する形になります。