一時テーブルっていうのは、今のセッションかトランザクションの間だけ存在するテーブルのこと。セッションが終わったり(またはトランザクションが閉じられたら)、一時テーブルとそのデータは砂浜の足跡みたいに消えちゃうんだ。データの一時保存や中間計算、複雑な操作のためのデータ準備にピッタリ!
なんで必要なの?
- データの一時保存:例えば、複雑な計算を何段階かでやりたいとき。メインのテーブルに負荷をかけずに、一時テーブルを使えばOK。
- データ分析:いろんなソースからデータを集めて処理して、分析が終わったら一時テーブルを消せばいい。
- 複雑なクエリの最適化:クエリを何段階かに分けて一時テーブルを使うと、実行が速くなることもあるよ。
- リスクの最小化:本物のテーブルをうっかり壊す心配なし!一時テーブルは完全に隔離されてるから安心。
一時テーブルのすごいところは、そのデータが自分にしか見えないこと!他のユーザーは中身を覗けないから、実験にもってこいだよ。
一時テーブルの作成
一時テーブルの作り方は普通のテーブルとほぼ同じだけど、TEMPかTEMPORARYってキーワードを追加するだけ。
シンタックス:
CREATE TEMP TABLE table_name (
column_name data_type constraints,
...
);
めっちゃ簡単でしょ?一時テーブルはセッションが終わったら自動で消えるよ。
例として、学生データを保存する一時テーブルを作ってみよう:
CREATE TEMP TABLE temp_students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER CHECK (age > 0)
);
これでtemp_studentsって一時テーブルができた!普通のテーブルみたいにデータを入れて使えるけど、セッションを閉じたら消えるから注意してね。
クエリから一時テーブルを作る
一時テーブルの構造をいちいち書くのが面倒なとき、特にクエリの結果をちょっと保存して使いたいだけなら、この形が便利:
CREATE TEMP TABLE テーブル名 AS
SELECT ...;
この書き方だと、一時テーブルを作るだけじゃなくて、クエリの結果で即データも入るよ。
例えば、どのコースにも登録してない学生を保存したいとき:
CREATE TEMP TABLE temp_unregistered_students AS
SELECT s.id, s.name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
WHERE e.student_id IS NULL;
これでtemp_unregistered_studentsってテーブルができて、他のスクリプトでも使い回せる!同じクエリを何度も書かなくていいね。
なんでこれが便利?
- カラムや型を明示しなくてOK。PostgreSQLが
SELECTの結果から自動で決めてくれる。 - 一時データを何度も再計算せずに使い回せる。
- レポートやETL処理、分析でめっちゃ役立つ。
トランザクション内での一時テーブル
一時テーブルはトランザクションの中でも作れる。この場合、トランザクションが終わったら自動で消えるよ。データがDBに残らないって確信したいときに便利。トランザクションについてはもうちょい後で詳しくやるから、今は気楽に楽しんでて :P
例:
BEGIN;
CREATE TEMP TABLE temp_transactions (
transaction_id SERIAL PRIMARY KEY,
amount NUMERIC(10, 2) NOT NULL,
status VARCHAR(50)
);
INSERT INTO temp_transactions (amount, status)
VALUES (100.50, '保留中');
-- データを見てみよう
SELECT * FROM temp_transactions;
COMMIT;
-- これでtemp_transactionsテーブルは消えた!
COMMITの代わりにROLLBACKを使っても、データもテーブルも消えるよ。
一時テーブルの実用例
例1:データの一時的な結合
例えば、studentsとcoursesって2つのテーブルがあるとする。どの学生がまだコースに登録してないか調べたいとき、まず一時テーブルにデータを集めてから分析できる。
CREATE TEMP TABLE temp_unregistered_students AS
SELECT s.id, s.name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
WHERE e.student_id IS NULL;
-- これで一時テーブルtemp_unregistered_studentsを使って作業できる。
SELECT * FROM temp_unregistered_students;
例2:レポート用データの準備
複数のテーブルからデータを集めて変換して、レポートを作りたいとき。一時テーブルはこういう用途に最適!
CREATE TEMP TABLE temp_sales AS
SELECT p.product_id, p.name, SUM(s.quantity) AS total_quantity
FROM products p
JOIN sales s ON p.product_id = s.product_id
GROUP BY p.product_id, p.name;
-- 結果を持った一時テーブルができた。これを使ってレポートを作ろう:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;
一時テーブルのコツと特徴
一時テーブルの名前付け:もしstudentsって普通のテーブルがあっても、同じ名前の一時テーブルを作れる!セッション内では一時テーブルが優先されるよ。でも、どっちを使ってるか忘れると混乱するから注意。
一時テーブルの最適化:PostgreSQLはPRIMARY KEYやUNIQUE制約があるカラムには自動でインデックスを作ってくれる。一時テーブルでも同じ。もっと速くしたいなら、自分でインデックスを追加してもOK:
CREATE INDEX idx_temp_students_age ON temp_students (age);
一時テーブルの削除:セッションが終わる前に一時テーブルを消したいなら、DROP TABLEコマンドを使おう:
DROP TABLE temp_students;
一時テーブルのデータ量:一時テーブルは(リソースが足りてれば)メモリ上に保存されるから超速い!でも、データが多すぎるとディスクを使い始めるから気をつけて。
よくあるミスとその回避法
ミス1:「テーブルはすでに存在します」
同じ名前の一時テーブルがすでにある状態で作ろうとするとエラーになる。CREATE TEMP TABLE IF NOT EXISTSを使うか、作る前にテーブルを消そう:
DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);
ミス2:「テーブルが早く消えすぎる」
トランザクション内で一時テーブルを作った場合、トランザクションが終わると消えちゃうから注意!事前にちゃんと計画しよう!
GO TO FULL VERSION