PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

An toàn chuỗi postgresql cho các bảng tạm thời

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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi loại. Tôi phải làm gì với giá trị PostgreSQL OID trong libpq trong C?

  2. Triển khai và mở rộng PostgreSQL v13 với ClusterControl 1.8.2

  3. Làm cách nào để khôi phục một bảng từ bản sao lưu .sql postgresql?

  4. Nối / hợp nhất các giá trị mảng trong quá trình nhóm / tổng hợp

  5. Tôi có thể tự động tạo bảng trong PostgreSQL từ tệp csv có tiêu đề không?