Open Source WEB

一時テーブルの作り方は、CREATE TABLE の2語の間に、 TEMPORARY が入っていると一時テーブルが作られる。

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ...

では、いつものように適当なテーブル名で作ってみよう。

mysql> CREATE TEMPORARY TABLE `関東` (`名` varchar(20), `都` varchar(20))
    -> DEFAULT CHARACTER SET eucjpms;
Query OK, 0 rows affected (0.17 sec)
 
mysql> SHOW CREATE TABLE `関東`\G
*************************** 1. row ***************************
       Table: 関東
Create Table: CREATE TEMPORARY TABLE `関東` (
  `名` varchar(20) default NULL,
  `都` varchar(20) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=eucjpms
1 row in set (0.00 sec)
 
mysql>

さて、一時テーブルができたはずなので、テーブルのリスト表示をしてみよう。

mysql> show tables;
Empty set (0.00 sec)
 
mysql>

しかし、何も表示されない。

英文マニュアルのA.7.3. TEMPORARY TABLE Problems という個所に

The SHOW TABLES statement does not list TEMPORARY tables.

とあるので、SHOW TABLE では見えないようだ。

一時テーブルは、SHOW TABLES では見えない。

確認するには、実際に作ったテーブルを使ってみないといけないようだ。

mysql> INSERT INTO `関東` VALUES ('神奈川県', '横浜市');
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from `関東`;
+----------+--------+
| 名       | 都     |
+----------+--------+
| 神奈川県 | 横浜市 |
+----------+--------+
1 row in set (0.01 sec)

mysql>

他のセッションからは見えない

同じユーザで、もう1つ別のセッションで同じMySQLサーバに繋いで、 いま作った一時テーブル `関東` が見られるか調べてみよう。

shell$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 5.0.15-standard-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> USE test;
Database changed
mysql> SELECT * FROM `関東`;
ERROR 1146 (42S02): Table 'test.関東' doesn't exist
mysql>

ということで、他のセッションからは隠されている。


一時テーブル名の変更

RENAME TABLE を使って変更しようとすると、

mysql> RENAME TABLE `関東` TO `関東甲信越`;
ERROR 1017 (HY000): Can't find file: './test/関東.frm' (errno: 2)
mysql>

となって、何と、該当データベースの下にテーブルフォーマットファイルが 在ると勝手に仮定してエラーを出してしまう。

では、変更はできないのかというと、そうではない。

mysql> ALTER TABLE `関東` RENAME `関東甲信越`;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `関東甲信越` VALUES ('山梨県','甲府市');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM `関東甲信越`;
+----------+--------+
| 名       | 都     |
+----------+--------+
| 神奈川県 | 横浜市 |
| 山梨県   | 甲府市 |
+----------+--------+
2 rows in set (0.00 sec)

mysql>

ということで、名前を変更し、新しい名前でデータを追加し、確認もできた。 すべて大丈夫みたいだ。


さまざまな型の一時テーブル

様々な型、つまりデフォルトでできたMyISAMだけでなく、 InnoDB, HEAP, MERGE についても調べるべきだが、面倒なのでやらない。

一時テーブルはファイルにはならない、つまり一時的なテーブルなので、 セッションが終ると生滅してしまうので、ファイルにならないのである。 だから、MySQLのデータディレクトリ以下を調べても該当ファイルは 見つからないのだが、これも面倒なのでやらない。

神経質に言えば、まだまだ詳細に調べないといけないのだが、 このあたりで一時テーブルについては終えることにしよう。 興味のある方、疑い深い方は、しっかり調べて、 もし何かおかしな挙動を発見したら知らせてくれると助かる。


戻る:MERGEテーブルの定義方法

次へ:カラム名にはバイト数制限があるだけ


フィードバック:

Name:
Comment:
Puput: (Sat Feb 18 07:39:00 2012 )
Sharp thinikng! Thanks for the answer.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us