临时表对于同一会话中的所有操作都是可见的。因此,在删除存在的临时表之前(在您的情况下提交事务),您 无法 在同一会话中 创建同名的临时表。
您可能要使用:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
有关
CREATETABLE手册的更多信息。
唯一的临时表
为了使临时表在每个“线程”中处于本地(在同一会话中),您需要使用 唯一的表名 。一种方法是使用无限制的
SEQUENCE动态SQL-
以过程语言(如plpgsql)或DO语句(基本上相同,但不存储函数)使用。
运行一:
CREATE SEQUENCE myseq;
用:
DO $$BEGINEXECUTE 'CREATE TABLE tmp' || nextval('myseq') ||'(id int)';END;$$要知道最新的表名:
SELECt 'tmp' || currval('myseq');或者将它们全部放入plpgsql函数中并返回表或重用表名。
但是,由于普通的SQL语句使用硬编码的标识符运行,因此所有其他SQL命令都必须动态执行。因此,最好将它们全部放入plpgsql函数中。
使用相同临时表的唯一ID
另一种可能的解决方案是对同一会话中的所有线程使用 相同的临时表 , 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 threadSQL:
INSERT INTO tmptbl(thread_id, col1) VALUES(my_id, 2), (my_id, 3), (my_id, 4);SELECT * FROM tmptbl WHERe thread_id = my_id;



