2017-05-10 11 views
0

MacでToadクライアントを使用しているPostgreSQL 9.6.2を使用しています。自動コミットはONに設定されています。私が走ったときに奇妙な何かが起こるPostgreSQL TEMPテーブルが存在するか存在しないのですか

CREATE TEMP TABLE demo_pairs 
AS 
WITH t (name, value) AS (VALUES ('a', 'b'), ('c', 'd')) 
SELECT * FROM t; 

: 私が最初にこのような単純な一時テーブルを作成し

SELECT * FROM demo_pairs; 

は私が(作成再実行せずに)選択を実行するたびに、それが交互に正常に値とエラーテーブルを選択する間に存在しません!

私は何が起こっているのか理解できますか?

+0

これは、同じバージョンのデータベースサーバーと 'psql'コマンドラインクライアントでは再現できません。 – zwol

答えて

1

https://www.postgresql.org/docs/current/static/sql-createtable.html

TEMPORARYまたはTEMP

指定した場合、テーブルは一時テーブルとして作成されます。一時的な テーブルは、セッションの終了時に自動的に削除されるか、または現在のトランザクションの最後にオプションで (オプションで、以下のON COMMIT を参照)。 がスキーマ修飾名で参照されていない限り、同じ名前を持つ既存の永続表は、テンポラリ表が存在する間に現行セッションに対して には表示されません。 一時テーブルに作成されたインデックスは、自動的に一時的なものになります。

セッションを閉じたり、自分で閉じることができます(ネットワークの問題など)。一時テーブルは削除されます。

ON COMMITをONを使用して 制御することができるトランザクションブロックの終わりで

一時テーブルの動作をCOMMIT: はまた、あなたはそれを、それは同様に、取引終了にドロップされた方法を作成することができます。 3つのオプションがあります:

特別なアクションは、トランザクションの両端で取られていないローを保護します。これは のデフォルト動作です。

DELETE ROWS

、一時テーブル内のすべての行が各 トランザクションブロックの終了時に削除されます。本質的には、自動TRUNCATEはそれぞれ コミットで実行されます。

DROP

一時テーブルは、現在のトランザクションブロックの終了時に削除されます。

関連する問題