SQLの一時テーブルについてまとめています。
SQLの一時テーブル作成はcreate TEMPORARY tableセッション中のみ存在する特殊テーブル
一時テーブルは同一セッション中のみ存在するテーブルです。セッション終了後は、自動的に削除されます。
下記はMySQLの例です。create TEMPORARYで一時テーブルemployees_tmpを作成後、いったんセッションを終了(MySQLクライアントを終了)し、再接続すると一時テーブルが削除されています。
create TEMPORARY table employees_tmp select * from employees; mysql> select * from employees_tmp limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | xGeorgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.01 sec) mysql> quit Bye #mysqlに再接続 mysql> select * from employees_tmp limit 10; ERROR 1146 (42S02): Table 'employees.employees_tmp' doesn't exist
【関連記事】
▶MySQLのcreate tableサンプルコード集 カラム定義を自動出力する方法は?
一時テーブルの仕様はDBMSにより異なります。例えばSQL Serverは一時テーブル名は先頭に「#」をつけて、「#employees_tmp」とするルール。セッション終了後も削除しないかぎり一時テーブルは残る仕様になっています。
トランザクション中で一時テーブルを生成するとrollbackでデータが削除される
トランザクション内で一時テーブルを作成し、rollbackをおこなうと、テーブル自体は残りますが、データは削除されます。
テーブルを作成するcreate TEMPORARY tableはrollback対象にならず、データを複製する部分のみがロールバックされるんですね。
Database changed #トランザクション開始 mysql> begin; Query OK, 0 rows affected (0.00 sec) #一時テーブル作成 データは既存のemployeesを複製 mysql> create TEMPORARY table employees_tmp select * from employees; Query OK, 300025 rows affected (1.44 sec) Records: 300025 Duplicates: 0 Warnings: 0 #一時テーブルにデータが存在することを確認 mysql> select * from employees_tmp limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | xGeorgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.01 sec) #トランザクションをロールバックする mysql> rollback; Query OK, 0 rows affected, 1 warning (1.88 sec) #一時テーブルは存在するが、データが削除されている mysql> select * from employees_tmp limit 10; Empty set (0.00 sec)
まとめ
- 一時テーブルは、create TEMPORARY tableで作成する
- セッション終了後は一時テーブルは削除される
- トランザクション中で一時テーブルを作成しrollbackすると、テーブルは残りデータは削除される