gpt4 book ai didi

postgresql - 将 CSV 导入 Postgres 并在需要时更新/替换任何字段

转载 作者:行者123 更新时间:2023-11-29 14:21:46 25 4
gpt4 key购买 nike

我目前保留一个 CSV 主文件,我经常更新它来管理产品列表。

如果我尝试直接导入 CSV 文件,我会收到错误“重复键值违反唯一约束...”目前,我通过删除表中的所有项目更新我的 Products Postgres 表,然后将所有数据导入回来又进来了

我意识到这不是执行此操作的好方法。有没有更好的方法来解决这个问题?我目前使用 pgAdmin III 和 PG Commander 客户端。

最佳答案

您可以通过定义一个触发器函数来做到这一点,该函数尝试更新现有记录,并且仅在未找到记录时才允许继续插入。

当然,要实现这一点,您需要有一个主键或其他标准来唯一标识行。

假设你的表是这样定义的:

CREATE TABLE TEST(
id INT PRIMARY KEY,
name TEXT,
amount INT
);

触发函数可能如下所示:

CREATE OR REPLACE FUNCTION test_insert_before_func()
RETURNS TRIGGER
AS $BODY$
DECLARE
exists INTEGER;
BEGIN

UPDATE test SET name=new.name, amount=new.amount
WHERE id=new.id
RETURNING id INTO exists;

-- If the above was successful, it would return non-null
-- in that case we return NULL so that the triggered INSERT
-- does not proceed
IF exists is not null THEN
RETURN NULL;
END IF;

-- Otherwise, return the new record so that triggered INSERT
-- goes ahead
RETURN new;


END;
$BODY$
LANGUAGE 'plpgsql' SECURITY DEFINER;

CREATE TRIGGER test_insert_before_trigger
BEFORE INSERT
ON test
FOR EACH ROW
EXECUTE PROCEDURE test_insert_before_func();

现在,如果我插入一个尚不存在的行,它会被插入:

test=> insert into test(id,name,amount) values (1,'Mary',100);
INSERT 0 1
test=> select * from test;
id | name | amount
----+------+--------
1 | Mary | 100
(1 row)

如果我尝试插入具有相同 ID 的行:

test=> insert into test(id,name,amount) values (1,'Mary',200);
INSERT 0 0
test=> select * from test;
id | name | amount
----+------+--------
1 | Mary | 200
(1 row)

这次更新行而不是插入行。

如果我从 CSV 文件加载行,效果也一样。

但是:您可能没有考虑到一件事:这不会删除数据库中存在但 CSV 文件中不存在的任何记录。如果你想让它工作,你需要一个更复杂的解决方案——也许是这样的序列:

  1. 将 CSV 文件加载到临时表中
  2. 从实际表中删除临时表中不存在的所有行。表格

    DELETE FROM test WHERE id NOT IN (SELECT id FROM temp);
  3. 然后最后从临时文件中插入行。表转换为真实表:

    INSERT INTO test(id,name,amount) (SELECT id,name,amount FROM temp);

此答案不考虑并发问题,以防表可能被其他用户同时更新。但是,如果您只从 CSV 文件加载 if,那么这不太可能成为问题。

关于postgresql - 将 CSV 导入 Postgres 并在需要时更新/替换任何字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22802726/

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