【问题标题】:Import CSV into Postgres: Update & Insert at the same time将 CSV 导入 Postgres:同时更新和插入
【发布时间】: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


【解决方案1】:

假设您对 id 列有一个主要或唯一约束,您可以使用单个语句来执行此操作,不需要函数:

insert into test (id, text)
select id, text
from tmp_table
on conflict (id) 
  do update set text = excluded.text;

【讨论】:

  • 是的,我首先尝试过,但我总是收到错误:子查询返回了不止一行
  • @StackAsk:那么您使用了不同的查询。答案中的查询不会导致该错误
  • 哦,是的,我的错。工作得很好。谢谢!
猜你喜欢
  • 2010-11-11
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
相关资源
最近更新 更多