一時テーブルは、同じセッションのすべての操作に表示されます。したがって、存在するテーブルを削除する前に、同じセッションで同じ名前の一時テーブルを作成することはできません(この場合はトランザクションをコミットします)。
あなたは使用したいかもしれません:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
詳細についてCREATE TABLE
は、マニュアルをご覧ください。
ユニークな一時テーブル
(同じセッション内の)「スレッド」ごとに一時テーブルをローカルにするには、一意のテーブル名を使用する必要があります。1つの方法は、バインドされていないSEQUENCE
動的SQLを使用することです。plpgsqlなどの手続き型言語またはDOステートメント(関数を格納しなくても基本的に同じです)で使用します。
1つ実行します。
CREATE SEQUENCE myseq;
使用する:
DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq') ||'(id int)';
END;
$$
最新のテーブル名を知るには:
SELECT 'tmp' || currval('myseq');
または、すべてをplpgsql関数に入れてテーブルを返すか、テーブル名を再利用します。
ただし、プレーンSQLステートメントはハードコードされた識別子で動作するため、以降のすべてのSQLコマンドは動的に実行する必要があります。したがって、すべてをplpgsql関数に入れるのがおそらく最善です。
同じ一時テーブルを使用するための一意のID
別の可能な解決策は、同じセッション内のすべてのスレッドに同じ一時テーブルを使用し、テーブルに列thread_id
を追加することです。この機能を多用する場合は、必ず列にインデックスを付けてください。次に、thread_id
(同じセッションで)スレッドごとに一意を使用します。
一回だけ:
CREATE SEQUENCE myseq;
スレッドごとに1回:
CREATE TEMP TABLE tmptbl(thread_id int, col1 int) IF NOT EXISTS;
my_id := nextval('myseq'); -- in plpgsql
-- else find another way to assign unique id per thread
SQL:
INSERT INTO tmptbl(thread_id, col1) VALUES
(my_id, 2), (my_id, 3), (my_id, 4);
SELECT * FROM tmptbl WHERE thread_id = my_id;