Các bảng tạm thời được hiển thị cho tất cả các hoạt động trong cùng một phiên. Vì vậy, bạn không thể tạo một bảng tạm thời có cùng tên trong cùng một phiên trước khi bạn bỏ giao dịch tồn tại (thực hiện giao dịch trong trường hợp của bạn).
Bạn có thể muốn sử dụng:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
Tìm hiểu thêm về CREATE TABLE
trong sách hướng dẫn.
Bảng tạm thời duy nhất
Để đặt bảng tạm thời là cục bộ cho mỗi "chuỗi" (trong cùng một phiên), bạn cần sử dụng tên bảng duy nhất . Một cách sẽ là sử dụng SEQUENCE
không bị ràng buộc và SQL động - bằng ngôn ngữ thủ tục như plpgsql hoặc trong câu lệnh DO (về cơ bản là giống nhau mà không cần lưu trữ một hàm.
Chạy một:
CREATE SEQUENCE myseq;
Sử dụng:
DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq') ||'(id int)';
END;
$$
Để biết tên bảng mới nhất:
SELECT 'tmp' || currval('myseq');
Hoặc đặt tất cả vào một hàm plpgsql và trả về bảng hoặc sử dụng lại tên bảng.
Tuy nhiên, tất cả các lệnh SQL khác phải được thực thi động, vì các câu lệnh SQL thuần túy hoạt động với các số nhận dạng được mã hóa cứng. Vì vậy, có lẽ tốt nhất là đặt tất cả vào một hàm plpgsql.
ID duy nhất để sử dụng cùng một bảng tạm thời
Một giải pháp khả thi khác có thể là sử dụng cùng một bảng tạm thời cho tất cả các chuỗi trong cùng một phiên và thêm một cột thread_id
để bàn. Đảm bảo lập chỉ mục cột, nếu bạn sử dụng nhiều tính năng này. Sau đó, sử dụng một thread_id
duy nhất mỗi chuỗi (trong cùng một phiên).
Chỉ một lần:
CREATE SEQUENCE myseq;
Một lần mỗi chủ đề:
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;