PostgreSQLの一時テーブルは、データを一時的に保存するためのテーブルで、セッションやトランザクションが終わると自動的に消える(設定によるけどね)。複雑な操作をシンプルにしたり、クエリの実行を速くしたいときにめっちゃ便利。
たとえば、君が三ツ星レストランのシェフだと想像してみて。サラダ一つのためだけにキッチンに専用のテーブルをずっと置いておく?しないよね?一時テーブルはまさにその「一時的な作業台」みたいなもの。使い終わったら片付ける感じ。
メリット:
- データの分離: 一時テーブルは今のセッションやトランザクションの中だけで見える。他の人は中身をいじれないよ。
- 効率的: 複雑なクエリを何度も実行しなくて済むように、中間結果を保存できる。
- クリーン: 作業が終わったら一時テーブルは自動で消える。
一時テーブル作成の構文
PostgreSQLでは、CREATE TEMP TABLEコマンドで簡単に一時テーブルを作れるよ。
基本の構文:
CREATE TEMP TABLE table_name (
column_name1 data_type constraints,
column_name2 data_type constraints,
...
);
TEMPまたはTEMPORARY— 一時テーブルだよって意味のキーワード。table_name— テーブル名。好きに決めていいけど、意味のある名前にしよう。column_name— カラム名。data_type— カラムのデータ型(INTEGER、TEXT、DATEなど)。constraints— 制約、例えばNOT NULL、UNIQUEなど。
シンプルな一時テーブルの作成例:
CREATE TEMP TABLE temp_sales (
id SERIAL PRIMARY KEY,
product_name TEXT NOT NULL,
sale_date DATE NOT NULL,
amount NUMERIC(10, 2) NOT NULL
);
- ここでは売上データを保存する一時テーブルを作ってるよ。
idフィールドは各行のIDを自動生成する。amountフィールドは小数点付きの値(例:1234.56)を保存する。
一時テーブルの使い方例
例1: 分析用の中間データを保存する
たとえばordersテーブルに全ての注文が入ってるとする。商品カテゴリごとの売上合計を出したいとき、複雑なクエリを毎回書く代わりに、一時テーブルにデータを保存できる。
一時テーブルを作成:
CREATE TEMP TABLE temp_category_sales (
category TEXT,
total_sales NUMERIC(10, 2)
);
一時テーブルにデータを入れる:
INSERT INTO temp_category_sales
SELECT category, SUM(amount)
FROM orders
GROUP BY category;
この一時テーブルを使って、たとえばトップ3カテゴリを抽出できる:
SELECT *
FROM temp_category_sales
ORDER BY total_sales DESC
LIMIT 3;
例2: 複数テーブルのデータをまとめる
例えば、students(学生情報)とenrollments(履修記録)の2つのテーブルがあるとする。それらの履修データを一箇所にまとめたい。
一時テーブルを作成:
CREATE TEMP TABLE temp_student_enrollments (
student_id INTEGER,
student_name TEXT,
course_id INTEGER,
enrollment_date DATE
);
データを結合:
INSERT INTO temp_student_enrollments
SELECT s.id, s.name, e.course_id, e.enrollment_date
FROM students s
JOIN enrollments e ON s.id = e.student_id;
このテーブルを使って、例えば各学生の履修数を数えるのも簡単:
SELECT student_name, COUNT(course_id) AS enrollment_count
FROM temp_student_enrollments
GROUP BY student_name
ORDER BY enrollment_count DESC;
トランザクション内の一時テーブル
さらに、一時テーブルはON COMMITキーワードでトランザクション単位に制限できるよ。
ON COMMITのバリエーション:
ON COMMIT DELETE ROWS: トランザクション終了時に一時テーブルの中身を消す。ON COMMIT PRESERVE ROWS: 終了後もデータを残す。ON COMMIT DROP: トランザクション終了時にテーブル自体を消す。
例:
CREATE TEMP TABLE temp_analysis (
category TEXT,
total_sales NUMERIC(10, 2)
) ON COMMIT DROP;
この場合、トランザクションが終わると一時テーブルは消えるよ。
実践的な意味と利用ケース
一時テーブルは実際のプロジェクトでも大活躍。いくつかのシチュエーションを見てみよう:
ケース:
- ビジネスでの複雑なレポート: 複雑な計算を何度もやるとき、中間結果を保存できる。
- ETL用のデータ準備: データの抽出・変換・ロード(ETL)プロセスで一時テーブルはよく使われる。
- クエリの開発・テスト: デバッグ中にデータを分離するために一時テーブルを使おう。
たとえば売上レポートを作るとき、一時テーブルを使えば、総収入や地域ごとのトレンドみたいな中間結果を保存できて、メインのDB構造に影響を与えずに済むよ。
特徴とよくあるミス
一時テーブルはだいたい楽しいけど、いくつか注意点もある:
- アクセス制限: 一時テーブルは今のセッションやトランザクションだけで見える。セッションを終えるとテーブルは消える。
- 名前の重複エラー: 同じセッション内で、すでに使われてる名前の一時テーブルは作れない。
- データの消失: セッションを終える前に必要なデータをちゃんと取り出しておこう。
- パフォーマンス: 一時テーブルに大量の行を入れると、メモリ使用量に影響が出ることもある。
GO TO FULL VERSION