CodeGym /コース /SQL SELF /PostgreSQLで一時テーブルを使う方法

PostgreSQLで一時テーブルを使う方法

SQL SELF
レベル 18 , レッスン 3
使用可能

一時テーブルっていうのは、今のセッションかトランザクションの間だけ存在するテーブルのこと。セッションが終わったり(またはトランザクションが閉じられたら)、一時テーブルとそのデータは砂浜の足跡みたいに消えちゃうんだ。データの一時保存や中間計算、複雑な操作のためのデータ準備にピッタリ!

なんで必要なの?

  • データの一時保存:例えば、複雑な計算を何段階かでやりたいとき。メインのテーブルに負荷をかけずに、一時テーブルを使えばOK。
  • データ分析:いろんなソースからデータを集めて処理して、分析が終わったら一時テーブルを消せばいい。
  • 複雑なクエリの最適化:クエリを何段階かに分けて一時テーブルを使うと、実行が速くなることもあるよ。
  • リスクの最小化:本物のテーブルをうっかり壊す心配なし!一時テーブルは完全に隔離されてるから安心。

一時テーブルのすごいところは、そのデータが自分にしか見えないこと!他のユーザーは中身を覗けないから、実験にもってこいだよ。

一時テーブルの作成

一時テーブルの作り方は普通のテーブルとほぼ同じだけど、TEMPTEMPORARYってキーワードを追加するだけ。

シンタックス:

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:データの一時的な結合

例えば、studentscoursesって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 KEYUNIQUE制約があるカラムには自動でインデックスを作ってくれる。一時テーブルでも同じ。もっと速くしたいなら、自分でインデックスを追加しても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:「テーブルが早く消えすぎる」

トランザクション内で一時テーブルを作った場合、トランザクションが終わると消えちゃうから注意!事前にちゃんと計画しよう!

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION