5

これは、一時テーブルを作成するために使用する構文です。

create temp table tmpTable (id bigint not null, primary key (id)) on commit drop;

これは、各トランザクションの終了時に、このテーブルが削除されることを意味します。私の質問は、同じセッション上の2つ以上のスレッドが値を作成して一時テーブルに挿入する場合、それぞれが独自のインスタンスを取得するのでしょうか、それとも一時インスタンスがセッション全体で共有されるのでしょうか。共有されている場合、スレッドごとにローカルにする方法はありますか?

ありがとうネッタ

4

1 に答える 1

8

一時テーブルは、同じセッションのすべての操作に表示されます。したがって、存在するテーブルを削除する前に、同じセッションで同じ名前の一時テーブルを作成することはできません(この場合はトランザクションをコミットします)。

あなたは使用したいかもしれません:

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;
于 2012-05-15T09:52:18.837 に答える