Tillfälliga tabeller är synliga för alla operationer i samma session. Så du kan inte skapa en tillfällig tabell med samma namn i samma session innan du släpper den som finns (begå transaktionen i ditt fall).
Du kanske vill använda:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
Mer om CREATE TABLE
i manualen.
Unika temptabeller
För att göra den tillfälliga tabellen lokal per "tråd" (i samma session) måste du använda unika tabellnamn . Ett sätt skulle vara att använda en obunden SEQUENCE
och dynamisk SQL - i ett procedurspråk som plpgsql eller i en DO-sats (som i princip är densamma utan att lagra en funktion.
Kör en:
CREATE SEQUENCE myseq;
Använd:
DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq') ||'(id int)';
END;
$$
För att veta det senaste tabellnamnet:
SELECT 'tmp' || currval('myseq');
Eller lägg in allt i en plpgsql-funktion och returnera tabellen eller återanvänd tabellnamnet.
Alla ytterligare SQL-kommandon måste dock köras dynamiskt, eftersom vanliga SQL-satser fungerar med hårdkodade identifierare. Så det är förmodligen bäst att lägga allt i en plpgsql-funktion.
Unikt ID för att använda samma temporära tabell
En annan möjlig lösning kan vara att använda samma temptabell för alla trådar i samma session och lägg till en kolumn thread_id
till bordet. Se till att indexera kolumnen om du använder funktionen mycket. Använd sedan ett unikt thread_id
per tråd (i samma session).
Endast en gång:
CREATE SEQUENCE myseq;
En gång per 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;