在PostgreSQL 9.1中插入或更新数据

3
我有一堆插入语句,它们的各自表格具有不同数量的列,如果记录不存在,我需要执行这些查询。我尝试将其实现为:
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')")

但是我收到一个错误,显示:

列"insert into gst_type_customer(name) values('Unregistered')"不存在


INSERT INTO xxx SELECT ... values to be inserted ... WHERE NOT EXISTS (SELECT * FROM xxx WHERE ... existence condition...) 这个怎么样? - Roman Hocke
谢谢您的回复。 - Omi Harjani
谢谢您的回复,这不就像上面的代码检查它是否存在,如果不存在则插入吗?那段代码片段运行得很好,如果我没有理解,您能给我一个示例吗? - Omi Harjani
3个回答

1
您可以像这样使用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'
)

虽然这对于单个查询有效,但我无法为每个查询实现相同的功能。是否可以在存储过程中实现相同的功能? - Omi Harjani

1

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)
;

1
您遇到的错误是在调用函数时使用了双引号引起的。以下代码应该可以解决问题:
select merge_table(E'insert into gst_type_customer(name) values(\'Unregistered\')'::text)

你需要使用单引号(双引号用于列名,单引号用于字符串字面量),并转义原始查询字符串中的任何单引号。


谢谢,问题已经解决了。 - Omi Harjani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接