Asial Blog

Recruit! Asialで一緒に働きませんか?

はじめから!リレーショナルデータベース:テーブル作成

カテゴリ :
バックエンド(プログラミング)
タグ :
Tech
DB
MySQL
こんにちは、志田です。
前回に引き続き、リレーショナルデータベースについてはじめから勉強していきましょう。

前回のまとめ





テーブルは、縦方向に並ぶ情報である「列」と、横方向に並ぶ「行」からなることを、前回勉強しました。
また、この縦方向に並ぶ「列」に対し、データの「型」を決めました。

今回は、まずデータベースを作り、そこに表を追加してみましょう。

データベースの作成



まずはデータベースを作成し、そこにテーブルを作るのが基本のやり方です。
Excelでいうと、新しいExcelのファイルを作ってブック(データベース)を作成し、シート(テーブル)を作るという動作に似ています。

では、MySQLに接続して、データベースを作成してみましょう。

  1. mysql> CREATE DATABASE client;

CREATE DATABASE データベース名;
このコマンドでデータベースを作成することができます。

大文字のコマンドは全て、MySQLの命令や、予約語といって、特別な意味のある単語です。
(命令の書き方としては、小文字でもOKです。
 命令と自分が入力する内容の区別がつきやすいので、ここでは大文字を使うことにします)

命令の終わりには、「;」を付けて、命令文が終わりであることを示します。

こうして、データベースをいくつでも作成することができます。


データベースの利用



私達がExcelのファイルを操作するときも、どのファイルを開くか指定するように、
データベースにおいても、どのデータベースを使うか、命令する必要があります。

  1. mysql> USE client;

USE データベース名

このUSEコマンドは、使うデータベースを切り替えることができます。

接続した直後の状態だとMySQLは、入力されたデータベースを操作するコマンドを
どのデータベースに対して実行してよいかわからないため、
こうして利用するデータベースを指定してやる必要があります。


表の作成



では、clientデータベースに表を作成してみましょう。

今回作成する表は、前回までに設計を行った、会社テーブル、部署テーブル、課名テーブル、担当者テーブルです。
表の作成は、CREATE文を使います。

まずは、会社テーブルを「company」として作成します。

  1. mysql> CREATE TABLE company(
  2.     ->   id      INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  3.     ->   name    VARCHAR(255) NOT NULL,
  4.     ->   address VARCHAR(255) NOT NULL,
  5.     ->   tel     VARCHAR(15) NOT NULL
  6.     -> );

表を作成するコマンドは、次のような文法になっています。

CREATE TABLE テーブル名 (カラム名 制約、オプション…);

前回までに考えたテーブルの構造と型の他に、「制約」というものが登場しました。
制約とは、そのカラムの決まりです。

例えば、companyテーブルの各カラムには「NOT NULL」という制約がついています。
これは、データを入れるときに、データがNULLではダメですという意味です。

NULLは、なにもない状態であることを指しています。
例えば、「0」は数字のゼロで、「」は文字がないという意味の空文字を示しています。
値そのものが入っていないことを表すのに、そのままでは表しにくいので「NULL」と表現しています。

companyテーブルでいうと、どのカラムも空ではいけない、なにかしらの値を入力しなければダメという意味です。

それから、idカラムには「PRIMARY KEY」という制約がついています。
これは、「このカラムはこの表で一意な値だ」
つまり、このidさえ指定すればレコードを指定できる、というカラムに対してつける制約です。

また、オプションというのは、カラムに補助的につける、まさにオプションです。
例えば、次の表で示す中にある「デフォルト」などは、有名なオプションのひとつです。

制約やオプションはこの他にもいくつかあります。
制約書き方意味
デフォルトDEFAULT 0
DEFAULT 'test' など
このカラムに何もデータを指定しないとき、デフォルトで入る値を指定します。
自動採番AUTO_INCREMENT自動で、1から順に連番をつけます。idなどのカラムに利用すると便利です。
ユニークUNIQUE列の中で、他と同じ値が取れないことを示します。例えば、ログインメールアドレスやユーザー名など、他の人と被っては困るものに付けます。


ということで、companyテーブルは、
・会社ID = id:データを入れれば自動で数字が割り振られる。companyテーブルの中で一意な値で、他と被ってはいけない
・会社名 = name:255文字までの可変長文字列で、空になってはいけない。
・会社住所 = address:255文字までの可変長文字列で、空になってはいけない。
・会社電話番号 = tel:15文字までの可変長文字列で、空になってはいけない。

というような構造の表になりました。
その他の表も、同じように作成してみます。

部署テーブルを、「group」として作成してみましょう。

  1. mysql> CREATE TABLE group(
  2.     ->   id          INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  3.     ->   company_id  INT NOT NULL,
  4.     ->   name        VARCHAR(30) NOT NULL
  5.     -> );
  6. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group(
  7.   id          INT PRIMARY KEY NOT NULL,…(略)

作成しようとしましたが、エラーが出て作成出来ませんでした。
MySQLは、エラーのある付近を示してくれています…
どうやら、「group」という名前がよくなかったようです。

このように、MySQLでは、MySQLが使う命令語を「予約語」としているため、
予約語をテーブル名にすると、エラーが表示されます。

予約語は沢山ありますが、うっかり使ってしまいそうな単語は
select, create, in, by, group, from などでしょうか。
他にもあるので、テーブル名を決める際には確認してください。

では、groupsがエラーで作成できなかったので、「groups」にして作成しましょう。

  1. mysql> CREATE TABLE groups(
  2.     ->   id          INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  3.     ->   company_id  INT NOT NULL,
  4.     ->   name        VARCHAR(30) NOT NULL
  5.     -> );

今度はうまくいきました。
続いて、残りのテーブルも作成します。

課名テーブル sections
  1. mysql> CREATE TABLE sections(
  2.     ->   id        INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  3.     ->   group_id  INT NOT NULL,
  4.     ->   name      VARCHAR(30) NOT NULL
  5.     -> );
  6. Query OK, 0 rows affected (0.00 sec)

担当者テーブル persons
  1. mysql> CREATE TABLE persons(
  2.     ->   id          INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  3.     ->   section_id  INT NOT NULL,
  4.     ->   name        VARCHAR(30) NOT NULL,
  5.     ->   email       VARCHAR(255) NOT NULL,
  6.     ->   gender      ENUM('male', 'female') NOT NULL,
  7.     ->   tel         VARCHAR(15),
  8.     ->   date        DATE NOT NULL,
  9.     ->   memo        TEXT
  10.     -> );
  11. Query OK, 0 rows affected (0.00 sec)

これで、全てのテーブルを作成することができました!
作成したテーブルの一覧を見るには、このコマンドを発行します。

SHOW TABLES;

  1. mysql> SHOW TABLES;
  2. +------------------+
  3. | Tables_in_client |
  4. +------------------+
  5. | company          |
  6. | groups           |
  7. | persons          |
  8. | sections         |
  9. +------------------+
  10. 4 rows in set (0.00 sec)

4つの表ができていることが確認できました。
では、この表がどんな構造だったのか確認してみます。

表の構造を確認するには、このコマンドを発行します。

DESCRIBE テーブル名;
または
DESC テーブル名;

  1. mysql> DESCRIBE company;
  2. +---------+--------------+------+-----+---------+----------------+
  3. | Field   | Type         | Null | Key | Default | Extra          |
  4. +---------+--------------+------+-----+---------+----------------+
  5. | id      | int(11)      | NO   | PRI | NULL    | auto_increment |
  6. | name    | varchar(255) | NO   |     | NULL    |                |
  7. | address | varchar(255) | NO   |     | NULL    |                |
  8. | tel     | varchar(15)  | NO   |     | NULL    |                |
  9. +---------+--------------+------+-----+---------+----------------+
  10. 4 rows in set (0.00 sec)

この表ではそれぞれ、以下の情報を示しています。
・Field:カラム名
・Type:型
・Null:NOなら、NOT NULL(NULLはダメ)。YESなら、NULLが入ってもOK
・Key:キー項目であるかどうか。PRIがついていれば主キーであることを示す
・Default:何も指定されていなかったときにデフォルトでとる値
・Extra:その他、付けられているオプション

このようにして、データベースを作成し、テーブルを作り、テーブルの構造を確認しました。


テーブルの修正



作成したテーブルですが、後から見返すと、おかしなところを発見しました。
personsテーブルのemailカラムにNOT NULL制約がついています。

今の時代、メールアドレスを持たない人は珍しいですが、
それでもまさとしが先週もらった名刺には、メールアドレスがないものもありました。
ここは、メールアドレスは必須入力ではなく、任意入力にすべきです。
データベースを修正しましょう。

データベースの修正には、以下のコマンドを使います。
ALTER TABLE テーブル名 MODIFY 直したいカラム名 制約、オプション;

実際に、personsテーブルにコマンドを発行します。

  1. mysql> ALTER TABLE persons MODIFY email VARCHAR(255);

イメージとしては、カラム情報の上書きです。
もともと、emailというカラムにはNOT NULL制約がついていましたが、
制約がない状態でカラムを上書きしました。

では、テーブルの構造が変わったかどうか、確認します。

  1. mysql> desc persons;
  2. +-----------+-----------------------+------+-----+---------+----------------+
  3. | Field     | Type                  | Null | Key | Default | Extra          |
  4. +-----------+-----------------------+------+-----+---------+----------------+
  5. | id        | int(11)               | NO   | PRI | NULL    | auto_increment |
  6. | setion_id | int(11)               | NO   |     | NULL    |                |
  7. | name      | varchar(30)           | NO   |     | NULL    |                |
  8. | gender    | enum('male','female') | NO   |     | NULL    |                |
  9. | email     | varchar(255)          | YES  |     | NULL    |                |
  10. | tel       | varchar(15)           | YES  |     | NULL    |                |
  11. | date      | date                  | NO   |     | NULL    |                |
  12. | memo      | text                  | YES  |     | NULL    |                |
  13. +-----------+-----------------------+------+-----+---------+----------------+
  14. 8 rows in set (0.00 sec)

きちんと変更され、emailのNULLがYESになっていることがわかりました。


今回のまとめ



今回は、以下の3つのことを学びました。
・データベースの作成
・データベースにテーブルを作成
・テーブルの構造を確認
・テーブルの構造を修正

データベースやテーブルを作るのは重要な作業ですが、
テーブルの構造を確認したり修正することで、
新しい修正事項などに、より柔軟に対応できます。