簡體   English   中英

在postgresql 9.1中插入或更新

[英]insert or update in postgresql 9.1

我有一堆插入語句,它們各自的表有不同數量的列,如果記錄不存在,我需要執行這些查詢。我試圖將其實現為

do $$
begin
IF not exists (SELECT 1 FROM gst_type_customer WHERE name = 'Unregistered') THEN
insert into gst_type_customer(create_date,write_date,create_uid,write_uid,name) values((now() at time zone 'UTC'),(now() at time zone 'UTC'),1,1,'Unregistered');
END IF;
end
$$

即使上面的代碼確實有效,雖然實現大量的查詢需要很多時間,所以我想做一個我可以調用的存儲過程

merge_check(insertquery,name[column to check for duplication],value)

但我無法直接執行插入查詢。

到目前為止,我已經想到了

CREATE OR REPLACE FUNCTION merge_tabla(data text)
RETURNS void AS
$BODY$
BEGIN
  execute(data);
END;
$BODY$
LANGUAGE plpgsql


select merge_table("insert into gst_type_customer(name) values('Unregistered')")

但我得到一個錯誤說

列“插入gst_type_customer(名稱)值('未注冊')”不存在

您可以像這樣使用INSERT ... SELECT

INSERT INTO gst_type_customer(create_date, write_date, create_uid, write_uid, name) 
SELECT (now() at time zone 'UTC'), (now() at time zone 'UTC'), 1, 1, 'Unregistered'
WHERE NOT EXISTS (
    SELECT *
    FROM gst_type_customer
    WHERE name = 'Unregistered'
)

postgres 9.1支持合並命令https://www.postgresql.org/message-id/attachment/23520/sql-merge.html

樣品:

MERGE CustomerAccount CA

USING (SELECT CustomerId, Sum(TransactionValue) As TransactionSum
       FROM Transactions
       WHERE TransactionId > 35345678
       GROUP BY CustomerId) AS T

ON T.CustomerId = CA.CustomerId

WHEN MATCHED 
  UPDATE SET Balance = Balance - TransactionSum

WHEN NOT MATCHED
  INSERT (CustomerId, Balance)
  VALUES (T.CustomerId, T.TransactionSum)
;

您獲得的錯誤是在調用函數時使用雙引號引起的。 這應該工作:

select merge_table(E'insert into gst_type_customer(name) values(\'Unregistered\')'::text)

您需要使用單引號(雙引號用於列名,單引號用於字符串文字)並轉義原始查詢字符串中的任何單引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM