使用“CREATE ... IF NOT EXISTS”时禁止“通知:存在关系”

时间:2014-10-01 21:13:39

标签: postgresql

我有一个函数可以创建一个临时表来存储和处理数据。问题是我想在单个事务中以1M次的顺序运行此函数,而不需要:

NOTICE:  relation "foo" already exists, skipping

输出~120次。有没有一种有效的方法呢?

什么效率不高:

  1. 取而代之的是

    DROP TABLE IF EXISTS
    
    • 导致共享内存不足
  2. 捕获duplicate_table异常(效率低于使用IF NOT EXISTS?)

    BEGIN
        CREATE TEMPORARY TABLE foo () ON COMMIT DROP;
    EXCEPTION
        WHEN duplicate_table THEN --do nothing
    END;
    

2 个答案:

答案 0 :(得分:11)

正如其他人所指出的那样,client_min_messages设置就是你想要的。有很多方法可以配置它。

SET client_min_messages = errorSELECT set_config('client_min_messages', 'error', false)将保留当前会话/连接的其余部分。

SET LOCAL client_min_messages = errorSELECT set_config('client_min_messages', 'error', true)在当前交易结束时重置。

CREATE FUNCTION语句的SET子句将设置范围仅限于此功能;这听起来像是你最合适的选择。例如:

CREATE FUNCTION f()
  RETURNS void
  SET client_min_messages = error
  LANGUAGE plpgsql
  AS ...

答案 1 :(得分:4)

简单地

SET client_min_messages = error;

在运行语句之前。

您也可以在psql命令行上设置批处理执行

PGOPTIONS="-c client_min_messages=error" psql -f somefile.sql dbname