2014-10-01 36 views
4

我有一個函數可以創建臨時表來存儲和處理數據。問題是我想在單筆交易中以1M次的順序運行此功能,而不需要:使用「CREATE ... IF NOT EXISTS」時禁止「注意:關係存在」

NOTICE: relation "foo" already exists, skipping 

輸出〜1M次。有沒有一種有效的方式來做到這一點?

什麼是效率不高:

  1. 刪除表,而不是

    DROP TABLE IF EXISTS 
    
    • 信息用完共享內存
  2. 鳳雲duplicate_table異常(升ESS比使用IF NOT EXISTS高效?)

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

'設置client_min_messages = ...':http://www.postgresql.org/docs/current/static/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN – 2014-10-01 22:33:14

+0

可以暫時配置嗎? – raphael 2014-10-01 22:39:37

+0

是的,使用'set'命令我提到 – 2014-10-02 06:01:04

回答

8

正如其他人所指出的那樣,client_min_messages設置爲你想要的。有很多種方法來配置它。

SET client_min_messages = error;將持續當前會話/連接的其餘部分。

SELECT set_config('client_min_messages', 'error', true);在當前交易結束時重置。

CREATE FUNCTION聲明的SET子句將僅將設置範圍限定爲此函數;這聽起來像是你的情況中最合適的選擇。例如:

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

「*將會持續保留當前會話/連接的其餘部分* - 但只有在事務沒有回滾的時候從手冊:」*如果SET(或者相當於SET SESSION )在稍後被中止的事務中發出,當事務回滾時,SET命令的效果消失*「 – 2014-10-02 10:43:31

1

只需

SET client_min_messages = error; 

運行的聲明(S)前。

您還可以設置它的psql命令行的批量處理

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