sql >> Database teknologi >  >> RDS >> PostgreSQL

postgresql trådsikkerhed til midlertidige tabeller

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;



  1. Hvordan bruger du WITH-klausulen i MySQL?

  2. (Dansk) Sådan bruger du Oracle Database 19c Pre-Built Developer VM

  3. Hvordan justify_hours() virker i PostgreSQL

  4. Opdater forespørgsel for at opdatere rækker i MySQL