一時テーブルは、同じセッションのすべての操作に表示されます。だからあなたはできません 同じセッションで同じ名前の一時テーブルを作成します 存在するものを削除する前に(あなたの場合はトランザクションをコミットします)。
使用することをお勧めします:
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
を使用します スレッドごと(同じセッション内)。
1回のみ:
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;