sql >> Databasteknik >  >> RDS >> PostgreSQL

postgresql trådsäkerhet för tillfälliga tabeller

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;



  1. MS Access anropar SQL Server lagrad procedur

  2. ROWID (oracle) - någon användning för det?

  3. Massdatakonverteringsfel (typfel överensstämmer eller ogiltigt tecken för angiven teckentabell) för rad 1, kolumn 4 (år)

  4. En databasmodell för en onlineundersökning. Del 2