[英]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.