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;