创建临时表(如果不存在)以用于自定义过程

时间:2014-04-08 06:35:57

标签: postgresql plpgsql postgresql-9.2

我试图摆脱使用临时表:

CREATE OR REPLACE FUNCTION test1(user_id BIGINT) RETURNS BIGINT AS
$BODY$

BEGIN
  create temp table temp_table1
  ON COMMIT DELETE ROWS

  as SELECT table1.column1, table1.column2 
  FROM table1
  INNER JOIN -- ............

  if exists (select * from temp_table1) then
    -- work with the result
    return 777;
  else 
    return 0;
  end if;

END;
$BODY$
LANGUAGE plpgsql;

我希望立即或尽快删除行temp_table1,这就是我添加ON COMMIT DELETE ROWS的原因。显然,我收到了错误:

ERROR:  relation "temp_table1" already exists

我尝试添加IF NOT EXISTS,但我无法做到,我根本无法找到我正在寻找的工作示例。

你的建议?

3 个答案:

答案 0 :(得分:11)

每次创建TEMP表之前的DROP表如下所示:

BEGIN
  DROP TABLE IF EXISTS temp_table1;
  create temp table temp_table1
  -- Your rest Code comes here

答案 1 :(得分:2)

你想在提交后删除术语表(不是DELETE ROWS),所以:

begin
  create temp table temp_table1
  on commit drop
...

Documentation

答案 2 :(得分:0)

临时表的问题是,删除和重新创建临时表会使pg_attribute严重膨胀,因此,一个阳光明媚的早晨,您会发现数据库性能下降,而pg_attribute 200+ gb却使您的数据库达到10gb。

因此,我们非常忙于具有> 500 rps的临时表,并通过nodejs进行异步i / o,因此,由于这个原因,pg_attribute变得非常繁琐。您所剩下的就是非常激进的吸尘功能,这会停止性能。 这里给出的所有答案都不能解决这个问题,因为它们都使pg_attribute严重膨胀。

所以解决方案很优雅

create temp table if not exists my_temp_table (description) on commit delete rows;

因此,您继续使用临时表并保存pg_attribute。