MySQLを学習(2):DataBaseとTableの作成

July 16, 2008 – 10:11 pm

前回、「還暦から始める動的Webサイト構築:MySQLを学習(1)」で、リレーショナルデータベース、そしてSQLを概観した。ここで述べたように、データベースの構築作業には、SQLコマンドを操るスキルの獲得が重要だ。スキル獲得のためには習うより慣れろ。我が家の蔵書データベースを試作し、必要なSQL構文を、逐次、学習することにした。

蔵書データベース: 我が家には、二~三千冊程度の本がある。ほとんど未整理の状態だ。本のタイトル、著者名などを入力すると、本の位置が分かる程度の機能を持った「蔵書データベース」があれば便利に違いない。ということで、本の「タイトル」、「著者名」、「出版社」、「出版日」、そしてこの本が置かれている「本棚の位置」をカラムとするテーブルを含む「蔵書データベース」を試作してみることにした。とりあえず、データベースに1つのテーブルだけの例を対象に、MySQLの操作法を学ぶことにしたわけだ。

作業手順としては、まずMySQLのインストール、設定の後、DataBase、それに引き続きTableを作成、そしてデータベースに登録する書籍の内容を表すデータを入力するということになる。

MySQLのインストールと設定: MySQLは、CentOS5に含まれており、これはインストール済みだ。このブログを作成しているWordPress自体がMySQLをベースとして作成されている。ということで、MySQLは当然のことながら、我がサーバ上で動作可能になっている。

ただ、インストール時のキャラクターセットは、ISO-8859-1 Latin1となっている。日本語文字を使用することを考えると、キャラクターセットとしてUTF8を統一して使用することが望ましい(我がシステムでは、UTF8を標準のキャラクターセットとして使用している)。データベースのキャラクターセットをUTF8にするためには、以下のように、MySQLのコンフィギュレーションファイル/etc/my.cnfのmysqldに –default-character-setオプションを加えてやれば良い;

/etc/my.cnf
   [mysqld]
   default-character-set=utf8
   skip-character-set-client-handshake
        

この設定により、新たに作成しようとするDataBaseのキャラクターセットはutf8となる。

DataBaseの作成: まず、「蔵書データベース」用の空のDataBase(BookDBと名づける)を作成する。実際のデータベース作成作業にあたっては、MySQL管理用ツールphpMyAdminを用いていることもできるが、コマンドベースでDataBaseの作成する場合には、以下のようになる(但し、ユーザtestuserのMySQLサーバへのアクセスがパスワードtestpassとしている)。

#mysql -u testuser -ptestpass     (testuserユーザでMySQLサーバへログイン)
mysql> create database BookDB;   (database BookDBを作成)
Query OK, 1 row affected (0.05 sec)

mysql> show databases;            (データベース BookDB の作成を確認)
+--------------------+
| Database     |
+--------------------+
| BookDB      |
| mysql        | 
+--------------------+
2 rows in set (0.00 sec)
        

BookDBが作成されていることが分かる。これとは別に、mysqlと名づけられたデータベースが存在する。これは、システム管理用のデータベースである。

<関連するSQL構文は以下の通り>
CREATE DATABASE構文
      CREATE DATABASE [IF NOT EXISTS] db_name
        指定した名前db_nameのデータベースが作成される。

Tableの作成: 作成した空のデータベース上に、「Book-ID」、「タイトル」、「著者名」、「出版社」、「出版日」、「本棚の位置」をカラムとするTableを定義する。ここで、カラム名を夫々、book_id, title, author, publisher, pub_date, positionとし、CREATE TABLE文を用いて、Tableを作成する;

mysql> CREATE TABLE IF NOT EXISTS book_table (
         book_id   int(5)        NOT NULL AUTO_INCREMENT PRIMARY KEY,
         title      varchar(240)  NOT NULL,
         author    varchar(240)  NOT NULL,
         publisher  varchar(10)  NOT NULL,
         pub_date  date        NOT NULL,
         position  varchar(10)    NOT NULL  );
Query OK, 0 rows affected (0.00sec)
        

Tableの作成は上記のmysqlコマンドを用いる方法に加えて、これまでの手順を一括して行うことも可能である。まず、以下の内容を持つ、book_table.sqlなるファイルを作成:

--
-- Table structure for table `book_table`
--
DROP TABLE IF EXISTS `book_table`;
CREATE TABLE `book_table` (
  `book_id` int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `title` varchar(240) NOT NULL,
  `author` varchar(240) NOT NULL,
  `pub_date` date NOT NULL,
  `publisher` varchar(10) NOT NULL,
  `position` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
        

以下のコマンドにより、データベースBookTableへの接続、そしてテーブルbook_tableの作成が一括して行うことができる。

# mysql –u username –p BookDB  <  book_table.sql
Enter password:*******
        

<関連するSQL構文は以下の通り>
CREATE TABLE構文

     CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement]

 指定した名前 tbl_name のテーブルが作成される。デフォルトでは、テーブルはカレントデータベースに作成される。テーブルがすでに存在する場合、カレントデータベースがない場合、またはデータベースが存在しない場合には、エラーが発生する。

          create_definition:
              col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
                         [[PRIMARY] KEY] [COMMENT 'string'] [reference_definition]
                | [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
              | KEY [index_name] (index_col_name,...)
             | INDEX [index_name] (index_col_name,...)
              | [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] (index_col_name,...)
              | FULLTEXT [INDEX] [index_name] (index_col_name,...)
                         | [CONSTRAINT [symbol]] FOREIGN KEY [index_name]   (index_col_name,...)                                                             [reference_definition]
                         | CHECK (expr)

         type:
                         TINYINT[(length)] [UNSIGNED] [ZEROFILL]
                       |  SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
                       | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
                       | INT[(length)] [UNSIGNED] [ZEROFILL]
                       | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
                       | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
                       | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
                       | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
                       | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
                       | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
                       | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
                       | CHAR(length) [BINARY | ASCII | UNICODE]
                       | VARCHAR(length) [BINARY]
                       | DATE
                       | TIME
                       | TIMESTAMP
                       | DATETIME
                       | TINYBLOB
                       | BLOB
                       | MEDIUMBLOB
                       | LONGBLOB
                       | TINYTEXT
                       | TEXT
                       | MEDIUMTEXT
                       | LONGTEXT
                       | ENUM(value1,value2,value3,...)
                       | SET(value1,value2,value3,...)

         table_options:
                        (省 略)
         select_statement:
                        (省 略)
        

作成したTableの確認: 作成したテーブルの内容は、DESCRIBE文により確認することができる。

mysql> describe book_table;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| book_id   | int(5)       | NO   | PRI | NULL    | auto_increment | 
| title     | varchar(240) | NO   |     | NULL    |                | 
| author    | varchar(240) | NO   |     | NULL    |                | 
| pub_date  | date         | NO   |     | NULL    |                | 
| publisher | varchar(10)  | NO   |     | NULL    |                | 
| position  | varchar(10)  | NO   |     | NULL    |                | 
+-----------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

参考サイト
      http://dev.mysql.com/doc/refman/4.1/ja/create-table.html
   http://www.atmarkit.co.jp/flinux/rensai/mysql5_01/mysql5_01a.html
   http://wota.jp/ac/?date=20061011


  1. 3 Trackback(s)

  2. Sep 17, 2008: 蔵書管理システムを作成してみた | Yama's Memorandum
  3. Nov 19, 2008: アマゾンAPIを活用した蔵書管理システム(3) | Yama's Memorandum
  4. Oct 28, 2011: 自宅サーバー構築・覚書きリスト | Yama's Memorandum

Post a Comment