Midlertidige tabeller er synlige for alle operationer i samme session. Så du kan ikke opret en midlertidig tabel med samme navn i samme session før du dropper den, der eksisterer (forpligter transaktionen i dit tilfælde).
Du vil måske bruge:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
Mere om CREATE TABLE
i manualen.
Unikke midlertidige tabeller
For at gøre den midlertidige tabel lokal pr. "tråd" (i samme session) skal du bruge unikke tabelnavne . En måde ville være at bruge en ubundet SEQUENCE
og dynamisk SQL - i et proceduresprog som plpgsql eller i en DO-sætning (som grundlæggende er det samme uden at gemme en funktion.
Kør en:
CREATE SEQUENCE myseq;
Brug:
DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq') ||'(id int)';
END;
$$
Sådan kender du det seneste tabelnavn:
SELECT 'tmp' || currval('myseq');
Eller sæt det hele ind i en plpgsql-funktion og returner tabellen eller genbrug tabelnavnet.
Alle yderligere SQL-kommandoer skal dog udføres dynamisk, da almindelige SQL-sætninger fungerer med hårdkodede identifikatorer. Så det er nok bedst at sætte det hele ind i en plpgsql-funktion.
Unikt ID til at bruge samme midlertidige tabel
En anden mulig løsning kunne være at bruge den samme temp-tabel for alle tråde i samme session, og tilføj en kolonne thread_id
til bordet. Sørg for at indeksere kolonnen, hvis du gør meget brug af funktionen. Brug derefter en unik thread_id
per tråd (i samme session).
Kun én gang:
CREATE SEQUENCE myseq;
Én gang pr. tråd:
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;