【发布时间】:2017-05-31 07:46:35
【问题描述】:
所以我对 Postgresql 还很陌生,并通过在 Postgres9.6 上使用 pgadmin4 测试一些东西来开始使用它。
问题:
我有一张桌子:test(id, text)
在这张表中,我有 10 行数据。 现在我想导入一个 12 行的 CSV 来更新测试表。前 10 行的一些文本已更改,我想从 CSV 插入另外 2 行。
我知道您可以截断表中的所有数据,然后再次从 CSV 导入所有数据,但这不是一个好方法。我想通过一个查询更新现有数据并插入新数据。
我已经找到了一个可以通过使用临时表来解决这个问题的函数。这会正确更新现有行,但不会插入另外 2 行
CREATE OR REPLACE FUNCTION upsert_test(integer,varchar) RETURNS VOID AS $$
DECLARE
BEGIN
UPDATE test
SET id = tmp_table.id,
text = tmp_table.text
FROM tmp_table
WHERE test.id = tmp_table.id;
IF NOT FOUND THEN
INSERT INTO test(id,text) values
(tmp_table.id,tmp_table.text);
END IF;
END;
$$ Language 'plpgsql';
DO $$ BEGIN
PERFORM upsert_test(id,text) FROM test;
END $$;
那么我需要更改哪些内容才能使插入也正常工作?
【问题讨论】:
-
不相关,但是:语言名称是一个标识符。不要把它放在单引号中使用:
language plpgsql
标签: postgresql csv postgresql-9.6