PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

keamanan utas postgresql untuk tabel sementara

Tabel sementara terlihat oleh semua operasi dalam sesi yang sama. Jadi Anda tidak bisa buat tabel sementara dengan nama yang sama di sesi yang sama sebelum Anda menghapus yang ada (lakukan transaksi dalam kasus Anda).

Anda mungkin ingin menggunakan:

CREATE TEMP TABLE tmptbl IF NOT EXISTS ...

Selengkapnya tentang CREATE TABLE dalam manual.

Tabel temp unik

Untuk membuat tabel temp lokal per "utas" (dalam sesi yang sama), Anda perlu menggunakan nama tabel unik . Salah satu caranya adalah dengan menggunakan SEQUENCE un yang tidak terikat dan SQL dinamis - dalam bahasa prosedural seperti plpgsql atau dalam pernyataan DO (yang pada dasarnya sama tanpa menyimpan fungsi.

Jalankan satu:

CREATE SEQUENCE myseq;

Gunakan:

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

Untuk mengetahui nama tabel terbaru:

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

Atau masukkan semuanya ke dalam fungsi plpgsql dan kembalikan tabelnya atau gunakan kembali nama tabelnya.

Semua perintah SQL lebih lanjut harus dieksekusi secara dinamis, karena pernyataan SQL biasa beroperasi dengan pengidentifikasi kode keras. Jadi, mungkin yang terbaik adalah memasukkan semuanya ke dalam fungsi plpgsql.

ID unik untuk menggunakan tabel temp yang sama

Solusi lain yang mungkin adalah menggunakan tabel temp yang sama untuk semua utas dalam sesi yang sama dan tambahkan kolom thread_id Ke meja. Pastikan untuk mengindeks kolom, jika Anda sering menggunakan fitur tersebut. Kemudian gunakan thread_id yang unik per utas (dalam sesi yang sama).

Hanya sekali:

CREATE SEQUENCE myseq;

Sekali per utas:

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. Cara Menghindari Looping Trigger Calls Di PostgreSQL 9.2.1

  2. Daftar tabel dalam skema PostgreSQL

  3. PostgreSQL meneruskan data dari CTE rekursif ke fungsi

  4. PostgreSQL:Nonaktifkan koneksi untuk sementara

  5. Lewati beberapa nilai dalam parameter tunggal