Временните таблици са видими за всички операции в една и съща сесия. Така че виене можете създайте временна таблица със същото имев същата сесия преди да махнете съществуващия (завършете транзакцията във вашия случай).
Може да искате да използвате:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
Повече за CREATE TABLE
в ръководството.
Уникални времеви таблици
За да направите временната таблица локална за "нишка" (в същата сесия), трябва да използвате уникални имена на таблици . Един от начините би бил да се използва необвързан SEQUENCE
и динамичен SQL - на процедурен език като plpgsql или в оператор DO (което по същество е същото, без да се съхранява функция.
Изпълнете едно:
CREATE SEQUENCE myseq;
Използвайте:
DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq') ||'(id int)';
END;
$$
За да знаете последното име на таблица:
SELECT 'tmp' || currval('myseq');
Или поставете всичко във функция plpgsql и върнете таблицата или използвайте повторно името на таблицата.
Всички следващи SQL команди трябва да се изпълняват динамично, тъй като обикновените SQL изрази работят с твърдо кодирани идентификатори. Така че вероятно е най-добре да поставите всичко във функция plpgsql.
Уникален идентификатор за използване на същата временна таблица
Друго възможно решение може да бъде използването на същата времева таблица за всички нишки в една и съща сесия и добавете колона thread_id
до масата. Не забравяйте да индексирате колоната, ако използвате интензивно функцията. След това използвайте уникален thread_id
на нишка (в същата сесия).
Само веднъж:
CREATE SEQUENCE myseq;
Веднъж на нишка:
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;