Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
MERGEはMyISAMを集めたもの
テーブルの型がMERGEの場合についての説明は、 どの本を見てもあまり書かれていない。 MERGEの実体はMyISAMであると書かれていても、 実際にMERGEテーブルを作る具体的記述が滅多に存在しない。
困ったなと思った時に参考にすべき書籍 "MySQL", by Paul Dubois, DEVELOPER'S LIBRARY, SAMS Publishing を見たら、ちゃんとMERGEの使い方が説明してあった。 この本は、本当にMySQLのバイブルだ。
まず、普通にMyISAMのテーブルを複数個作る。 そのとき、テーブルの構造は完全に一致している必要があり、 テーブルの名称だけが別のものをつくる。
ここでは、市区町村のデータを管理するために、以下のような 形式のテーブルを作ることにしよう。
+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | 名称 | varchar(10) | YES | | NULL | | | 読み | varchar(20) | YES | | NULL | | | 人口 | int(11) | YES | | NULL | | | 面積 | float(10,2) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
日本の市区町村の数くらいだったら、 MERGEにする必要などないのだが、 これは単なるテストなのであれこれ詮索するのは止めよう。
テーブルを都道府県単位で作ることにし、全体をまとめたものを 「都道府県」という名称のMERGEテーブルにしよう。
まず、MyISAMテーブルを作らなければならない。 最初に、「東京」を作ろう。 デフォルトキャラクタセットは、ここでは eucjpms にしておく。
CREATE TABLE `東京` (
`名称` VARCHAR(10), `読み` VARCHAR(20), `人口` INT, `面積` FLOAT(10,2)
) ENGINE=MyISAM DEFAULT CHARSET=eucjpms;
東京都の全市区町村のデータを入れるのは面倒なので、 以下のように一部のデータだけを入れてみた。
INSERT INTO `東京` VALUES
('千代田区','ちよだく',39551,11.64),
('中央区','ちゅうおうく',87416,10.15),
('新宿区','しんじゅくく',299808,18.23),
('世田谷区','せたがやく',835702,58.08),
('調布市','ちょうふし',214032,21.53),
('町田市','まちだし',405008,71.62),
('大島町','おおしままち',8786,91.06),
('檜原村','ひのはらむら',3004,105.42),
('小笠原村','おがさわらむら',2755,104.41);
次に、まったく同じ構造の「北海道」というテーブルを作る。 「東京」が「北海道」になるだけで、他はまったく同じである。
CREATE TABLE `北海道` (
`名称` VARCHAR(10), `読み` VARCHAR(20), `人口` INT, `面積` FLOAT(10,2)
) ENGINE=MyISAM DEFAULT CHARSET=eucjpms;
こちらも、データを入れておこう。
INSERT INTO `北海道` VALUES
('中央区','ちゅうおうく',196489,46.42),
('豊平区','とよひらく',209021,46.35),
('旭川市','あさひかわし',356931,747.60),
('歌志内市','うたしないし',5396,55.99),
('北見市','きたみし',110995,421.08),
('ニセコ町','にせこちょう',4642,197.13),
('羅臼町','らうすちょう',6717,397.84);
これで、それぞれのテーブルの内容を見ると、当然以下のようになっている。
mysql> SELECT * FROM `東京`; +----------+----------------+--------+--------+ | 名称 | 読み | 人口 | 面積 | +----------+----------------+--------+--------+ | 千代田区 | ちよだく | 39551 | 11.64 | | 中央区 | ちゅうおうく | 87416 | 10.15 | | 新宿区 | しんじゅくく | 299808 | 18.23 | | 世田谷区 | せたがやく | 835702 | 58.08 | | 調布市 | ちょうふし | 214032 | 21.53 | | 町田市 | まちだし | 405008 | 71.62 | | 大島町 | おおしままち | 8786 | 91.06 | | 檜原村 | ひのはらむら | 3004 | 105.42 | | 小笠原村 | おがさわらむら | 2755 | 104.41 | +----------+----------------+--------+--------+ 9 rows in set (0.01 sec) mysql> SELECT * FROM `北海道`; +----------+--------------+--------+--------+ | 名称 | 読み | 人口 | 面積 | +----------+--------------+--------+--------+ | 中央区 | ちゅうおうく | 196489 | 46.42 | | 豊平区 | とよひらく | 209021 | 46.35 | | 旭川市 | あさひかわし | 356931 | 747.60 | | 歌志内市 | うたしないし | 5396 | 55.99 | | 北見市 | きたみし | 110995 | 421.08 | | ニセコ町 | にせこちょう | 4642 | 197.13 | | 羅臼町 | らうすちょう | 6717 | 397.84 | +----------+--------------+--------+--------+ 7 rows in set (0.00 sec) mysql>
2つのテーブルを合わせたものはどうやったら作れるだろうか。
mysql> SELECT * FROM `東京`,`北海道`;
+----------+----------------+--------+--------+----------+--------------+--------+--------+
| 名称 | 読み | 人口 | 面積 | 名称 | 読み | 人口 | 面積 |
+----------+----------------+--------+--------+----------+--------------+--------+--------+
| 千代田区 | ちよだく | 39551 | 11.64 | 中央区 | ちゅうおうく | 196489 | 46.42 |
| 千代田区 | ちよだく | 39551 | 11.64 | 豊平区 | とよひらく | 209021 | 46.35 |
| 千代田区 | ちよだく | 39551 | 11.64 | 旭川市 | あさひかわし | 356931 | 747.60 |
| 千代田区 | ちよだく | 39551 | 11.64 | 歌志内市 | うたしないし | 5396 | 55.99 |
| 千代田区 | ちよだく | 39551 | 11.64 | 北見市 | きたみし | 110995 | 421.08 |
| 千代田区 | ちよだく | 39551 | 11.64 | ニセコ町 | にせこちょう | 4642 | 197.13 |
| 千代田区 | ちよだく | 39551 | 11.64 | 羅臼町 | らうすちょう | 6717 | 397.84 |
| 中央区 | ちゅうおうく | 87416 | 10.15 | 中央区 | ちゅうおうく | 196489 | 46.42 |
| 中央区 | ちゅうおうく | 87416 | 10.15 | 豊平区 | とよひらく | 209021 | 46.35 |
| 中央区 | ちゅうおうく | 87416 | 10.15 | 旭川市 | あさひかわし | 356931 | 747.60 |
..... 中略 ......
| 檜原村 | ひのはらむら | 3004 | 105.42 | 北見市 | きたみし | 110995 | 421.08 |
| 檜原村 | ひのはらむら | 3004 | 105.42 | ニセコ町 | にせこちょう | 4642 | 197.13 |
| 檜原村 | ひのはらむら | 3004 | 105.42 | 羅臼町 | らうすちょう | 6717 | 397.84 |
| 小笠原村 | おがさわらむら | 2755 | 104.41 | 中央区 | ちゅうおうく | 196489 | 46.42 |
| 小笠原村 | おがさわらむら | 2755 | 104.41 | 豊平区 | とよひらく | 209021 | 46.35 |
| 小笠原村 | おがさわらむら | 2755 | 104.41 | 旭川市 | あさひかわし | 356931 | 747.60 |
| 小笠原村 | おがさわらむら | 2755 | 104.41 | 歌志内市 | うたしないし | 5396 | 55.99 |
| 小笠原村 | おがさわらむら | 2755 | 104.41 | 北見市 | きたみし | 110995 | 421.08 |
| 小笠原村 | おがさわらむら | 2755 | 104.41 | ニセコ町 | にせこちょう | 4642 | 197.13 |
| 小笠原村 | おがさわらむら | 2755 | 104.41 | 羅臼町 | らうすちょう | 6717 | 397.84 |
+----------+----------------+--------+--------+----------+--------------+--------+--------+
FROMの後にテーブルを並べたのでは、 それらのテーブルの全組合せ(積)になってしまい、 まったく意味をなさない。
ということで、これをMERGEで1つのテーブルにしてしまうのは、 次回までに調べておくことにしよう。 最初に説明した "MySQL"の本、あるいはMySQLのオンラインマニュアルを見れば 分るのだが、どちらも英文なのである。
フィードバック: