ページ

2013年7月6日土曜日

postgresで一次テーブルをトランザクションで利用

postgresの一次テーブルについてのメモ
一次テーブルを利用しようとしたが仕様がいまいち
わからなかったのですこしまとめました。
大きく2点のまとめです。
1.一次テーブルをとりあえず作ったらどのタイミングで消えるのか
2.BEGIN,COMITのトランザクション間で一次テーブルを利用するにはどうすれば良いのか

この2つについて記載いたします。


環境
環境情報 構築日 ソフトウェア
CentOS 6.3 2013/07/06 postgresql8.4



1.一次テーブルをとりあえず作ったらどのタイミングで消えるのか
こちらについては、とりあえず一次テーブルを作る意味合いのメモです。


$ psql 
-- 以下SQL文を記載

-- 一次テーブルを作成
CREATE TEMP TABLE temptable1(id numeric(9,0));

-- この時点ではtemptable1は残っている
INSERT INTO temptable1 VALUES(1);
-- この時点ではtemptable1は残っている
BEGIN;
INSERT INTO temptable1 VALUES(2);
INSERT INTO temptable1 VALUES(3);
-- この時点ではtemptable1は残っている
SELECT * FROM temptable1;
COMMIT;
-- この時点ではtemptable1は残っている
SELECT * FROM temptable1;
-- この時点ではtemptable1は残っている
¥q
-- この時点でtemptable1は削除される
$ psql 

-- この時点でtemptable1は存在しない
¥d temptable1

と、上記のようになります。
特に意識せずに一次テーブルを作成すると、¥qで全体を抜けるまで
一次テーブルが有効です。ちなみにコンソールを2つ表示し
それぞれpsqlコマンドで同じDBに入っても作った方意外からは見えません。
これが一次テーブルです。


2.BEGIN,COMITのトランザクション間で一次テーブルを利用するにはどうすれば良いのか
こちらの使い方を自分で使いたかったのでまとめました。

$ psql 
-- 以下SQL文を記載

BEGIN;
-- 一次テーブルを作成 COMMIT DROPオプションがつきます
CREATE TEMP TABLE temptable1(a numeric(9,0)) ON COMMIT DROP;

-- テーブルが存在します。
¥d temptable1

COMMIT;

-- テーブルが存在しません。
¥d temptable1

このようにトランザクションを張る場合は、COMMIT DROPが有効です。
重たい動作をされる際にご利用ください。