gpt4 book ai didi

postgresql - 将 CSV 导入 Postgres : Update & Insert at the same time

转载 作者:行者123 更新时间:2023-11-29 14:04:43 26 4
gpt4 key购买 nike

所以我对 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 $$;

那么我需要更改什么才能使插入工作?

最佳答案

假设您在 id 列上有主要或唯一约束,您可以使用单个语句完成此操作,无需任何函数:

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

关于postgresql - 将 CSV 导入 Postgres : Update & Insert at the same time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44278702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com