As tabelas temporárias são visíveis para todas as operações na mesma sessão. Então você não pode crie uma tabela temporária com o mesmo nome na mesma sessão antes de descartar o que existe (confirme a transação no seu caso).
Você pode querer usar:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
Mais sobre
CREATE TABLE
no manual. Tabelas temporárias exclusivas
Para tornar a tabela temporária local por "thread" (na mesma sessão), você precisa usar nomes de tabela exclusivos . Uma maneira seria usar uma
SEQUENCE
não vinculada e SQL dinâmico - em uma linguagem procedural como plpgsql ou em uma instrução DO (que é basicamente a mesma sem armazenar uma função. Execute um:
CREATE SEQUENCE myseq;
Usar:
DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq') ||'(id int)';
END;
$$
Para saber o nome da tabela mais recente:
SELECT 'tmp' || currval('myseq');
Ou coloque tudo em uma função plpgsql e retorne a tabela ou reutilize o nome da tabela.
Todos os comandos SQL adicionais devem ser executados dinamicamente, pois as instruções SQL simples operam com identificadores codificados. Então, provavelmente é melhor colocar tudo em uma função plpgsql.
ID exclusivo para usar a mesma tabela temporária
Outra solução possível poderia ser usar a mesma tabela temporária para todos os threads na mesma sessão e adicione uma coluna
thread_id
para a mesa. Certifique-se de indexar a coluna, se você fizer uso intenso do recurso. Em seguida, use um thread_id
exclusivo por thread (na mesma sessão). Apenas uma vez:
CREATE SEQUENCE myseq;
Uma vez por fio:
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;