Tijdelijke tabellen zijn zichtbaar voor alle bewerkingen in dezelfde sessie. Dus je kunt niet maak een tijdelijke tabel met dezelfde naam in dezelfde sessie voordat u de bestaande laat vallen (voer de transactie in uw geval uit).
Misschien wilt u het volgende gebruiken:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
Meer over CREATE TABLE
in de handleiding.
Unieke tijdelijke tabellen
Om de tijdelijke tabel lokaal te maken per "thread" (in dezelfde sessie) moet je unieke tabelnamen gebruiken . Een manier zou zijn om een ongebonden SEQUENCE
. te gebruiken en dynamische SQL - in een proceduretaal zoals plpgsql of in een DO-statement (wat in principe hetzelfde is zonder een functie op te slaan.
Voer er een uit:
CREATE SEQUENCE myseq;
Gebruik:
DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq') ||'(id int)';
END;
$$
Om de laatste tafelnaam te weten:
SELECT 'tmp' || currval('myseq');
Of zet het allemaal in een plpgsql-functie en retourneer de tabel of hergebruik de tabelnaam.
Alle verdere SQL-commando's moeten echter dynamisch worden uitgevoerd, aangezien gewone SQL-instructies werken met hard gecodeerde identifiers. Het is dus waarschijnlijk het beste om alles in een plpgsql-functie te stoppen.
Unieke ID om dezelfde tijdelijke tabel te gebruiken
Een andere mogelijke oplossing zou kunnen zijn om de dezelfde tijdelijke tabel . te gebruiken voor alle threads in dezelfde sessie en voeg een kolom toe thread_id
Naar de tafel. Zorg ervoor dat u de kolom indexeert als u intensief gebruik maakt van de functie. Gebruik dan een unieke thread_id
per thread (in dezelfde sessie).
Eenmalig:
CREATE SEQUENCE myseq;
Eenmaal per draad:
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;