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

rap*_*ael 7 postgresql

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

NOTICE:  relation "foo" already exists, skipping
Run Code Online (Sandbox Code Playgroud)

输出~1M次.有没有一种有效的方法呢?

什么是无效的:

  1. 放弃桌子而不是

    DROP TABLE IF EXISTS
    
    Run Code Online (Sandbox Code Playgroud)
    • 导致共享内存耗尽
  2. 捕获duplicate_table异常(效率低于使用IF NOT EXISTS?)

    BEGIN
        CREATE TEMPORARY TABLE foo () ON COMMIT DROP;
    EXCEPTION
        WHEN duplicate_table THEN --do nothing
    END;
    
    Run Code Online (Sandbox Code Playgroud)

Nic*_*nes 12

正如其他人所指出的那样,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 ...
Run Code Online (Sandbox Code Playgroud)


Cra*_*ger 7

简单地

SET client_min_messages = error;
Run Code Online (Sandbox Code Playgroud)

在运行语句之前。

也可以在命令行设置psql批量执行

PGOPTIONS="-c client_min_messages=error" psql -f somefile.sql dbname
Run Code Online (Sandbox Code Playgroud)