PHP で MySQL を操作するのに役立つリファレンス

MySQL FAQ

一時テーブルと同じ名前のテーブルがある場合、両方を同時に使用できますか?

スポンサードリンク

一時テーブルを DROP するまで一時テーブルしか使用できなくなります。

MySQL では一時テーブルを作成する際に、既に存在しているテーブルと同じ名前を指定して作成することができます。このように同じ名前でテーブルを作成した場合、既存のテーブルは見えなくなり一時テーブルだけが見えるようになります。

両方のテーブルにアクセスすることはできません。既存のテーブルにアクセスしたい場合は、一時テーブルを DROP する必要があります。

実際のコードで確認する為、最初に次のコードで通常のテーブルを作成しテストデータを登録します。

事前準備
/* テスト用データベース作成 */
CREATE DATABASE TEST1;
CREATE DATABASE TEST2;

/* テスト用テーブル作成 */
CREATE TABLE TEST1.ITEM_LIST(ID INT, NAME VARCHAR(10));
CREATE TABLE TEST2.ITEM_LIST(ID INT, GROUP_ID INT, NAME VARCHAR(10));

/* テストデータ登録 */
INSERT INTO TEST1.ITEM_LIST VALUES(1, 'MySQL');
INSERT INTO TEST1.ITEM_LIST VALUES(2, 'Oracle');
INSERT INTO TEST1.ITEM_LIST VALUES(3, 'Access');
INSERT INTO TEST2.ITEM_LIST VALUES(1, 1, 'PHP');
INSERT INTO TEST2.ITEM_LIST VALUES(2, 1, 'Ruby');
INSERT INTO TEST2.ITEM_LIST VALUES(3, 2, 'Java');

/* テストデータが正しく登録されたことを確認 */
SELECT * FROM TEST1.ITEM_LIST ORDER BY ID;
SELECT * FROM TEST2.ITEM_LIST ORDER BY ID;

最後の 2 つの SELECT 文を実行した後、次のように表示されればテストデータが正しく登録できています。

mysql> SELECT * FROM TEST1.ITEM_LIST ORDER BY ID;
+------+--------+
| ID   | NAME   |
+------+--------+
|    1 | MySQL  |
|    2 | Oracle |
|    3 | Access |
+------+--------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM TEST2.ITEM_LIST ORDER BY ID;
+------+----------+------+
| ID   | GROUP_ID | NAME |
+------+----------+------+
|    1 |        1 | PHP  |
|    2 |        1 | Ruby |
|    3 |        2 | Java |
+------+----------+------+
3 rows in set (0.00 sec)

この状態で、TEST2 のデータベースに一時テーブルを作成します。一時テーブルを作成すると TEST2 データベースにある ITEM_LIST にアクセスできなくなります。

一時テーブルを作成
/* TEST2 データベース に ITEM_LIST テーブルを作成 */
CREATE TEMPORARY TABLE TEST2.ITEM_LIST(
    ID INT,
    NAME VARCHAR(50)
);

/* テストデータ登録 */
INSERT INTO TEST2.ITEM_LIST VALUES(1, 'Windows7');
INSERT INTO TEST2.ITEM_LIST VALUES(2, 'WindowsXP');

一時テーブルを作成した後、SELECT 文を実行すると、 TEST2.ITEM_LIST が一時テーブルになっていることが分かります。

mysql> SELECT * FROM TEST1.ITEM_LIST ORDER BY ID;
+------+--------+
| ID   | NAME   |
+------+--------+
|    1 | MySQL  |
|    2 | Oracle |
|    3 | Access |
+------+--------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM TEST2.ITEM_LIST ORDER BY ID;
+------+-----------+
| ID   | NAME      |
+------+-----------+
|    1 | Windows7  |  ← 一時テーブルの内容が表示される 
|    2 | WindowsXP |
+------+-----------+
2 rows in set (0.00 sec)

一時テーブルを DROP すれば、再び物理テーブルにアクセスすることができるようになります。

一時テーブルを削除
DROP TABLE TEST2.ITEM_LIST;

次の実行結果は DROP と SELECT を一緒に行ったものです。SELECT した結果、物理テーブルの内容が表示されます。

mysql> DROP TABLE TEST2.ITEM_LIST;  ← 一時テーブルを削除 
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT * FROM TEST1.ITEM_LIST ORDER BY ID;
+------+--------+
| ID   | NAME   |
+------+--------+
|    1 | MySQL  |
|    2 | Oracle |
|    3 | Access |
+------+--------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM TEST2.ITEM_LIST ORDER BY ID;
+------+----------+------+
| ID   | GROUP_ID | NAME |
+------+----------+------+
|    1 |        1 | PHP  |
|    2 |        1 | Ruby |
|    3 |        2 | Java |
+------+----------+------+
3 rows in set (0.00 sec)

mysql>
スポンサードリンク

一時テーブル

その他のカテゴリー一覧