sql >> Databáze >  >> RDS >> PostgreSQL

zabezpečení vláken postgresql pro dočasné tabulky

Dočasné tabulky jsou viditelné pro všechny operace ve stejné relaci. Takže nemůžete vytvořte dočasnou tabulku se stejným názvem ve stejné relaci než zahodíte ten, který existuje (ve vašem případě potvrďte transakci).

Možná budete chtít použít:

CREATE TEMP TABLE tmptbl IF NOT EXISTS ...

Další informace o CREATE TABLE v návodu.

Unikátní časové tabulky

Chcete-li, aby byla dočasná tabulka místní pro „vlákno“ (ve stejné relaci), musíte použít jedinečné názvy tabulek . Jedním ze způsobů by bylo použití nevázané SEQUENCE a dynamické SQL – v procedurálním jazyce, jako je plpgsql nebo v příkazu DO (což je v podstatě totéž bez uložení funkce.

Spusťte jeden:

CREATE SEQUENCE myseq;

Použijte:

DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq')  ||'(id int)';
END;
$$

Chcete-li zjistit nejnovější název tabulky:

SELECT 'tmp' || currval('myseq');

Nebo to všechno vložte do funkce plpgsql a vraťte tabulku nebo znovu použijte název tabulky.

Všechny další příkazy SQL však musí být prováděny dynamicky, protože jednoduché příkazy SQL pracují s pevně zakódovanými identifikátory. Takže asi bude nejlepší dát to všechno do funkce plpgsql.

Jedinečné ID pro použití stejné dočasné tabulky

Dalším možným řešením by mohlo být použití stejné tabulky temp pro všechna vlákna ve stejné relaci a přidejte sloupec thread_id ke stolu. Pokud tuto funkci intenzivně využíváte, nezapomeňte sloupec indexovat. Poté použijte jedinečný thread_id na vlákno (ve stejné relaci).

Pouze jednou:

CREATE SEQUENCE myseq;

Jednou za vlákno:

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. zachytit výjimku DB v aplikaci JSF+EJB

  2. Příklady UTC_DATE – MySQL

  3. Jak aktualizovat a objednávat pomocí ms sql

  4. Jak přidáte tlačítko pro úpravy do každého řádku v sestavě v Oracle APEX?