使用 pgadmin4 将复制查询导入到 postgresql 时更新而不是插入相同的主键
Update instead inserting same primary key when import using copy query to postgresql using pgadmin4
正如标题所说,我有 table 场 food_id(PK) 和 food_name 的食物。
我已经在 table
上有了这些数据
food_id|food_name
-----------------
0000001|food1
0000002|food2
0000003|food3
在我的 csv 上
0000001|apple
0000004|banana
0000005|grape
如果没有重复的 PK,这是我的查询
copy foodfrom 'd:\testingfood.csv' delimiter '|' csv
但我想将 food1 更新为 apple 到 apple 并插入 0000004|banana 和 0000005|grape?
可能吗?
您不能在单个 COPY
命令中完成此操作。使用临时 table 和 INSERT
与 ON CONFLICT
,例如:
create temp table tmp_food (like food); -- create temporary table like food
copy tmp_food from 'd:\testingfood.csv' delimiter '|' csv; -- copy to temp table
insert into food (food_id, food_name) -- insert into food from temp table
select food_id, food_name
from tmp_food
on conflict (food_id) do -- update instead of error
update set food_name = excluded.food_name;
drop table tmp_food; -- drop temp table
正如标题所说,我有 table 场 food_id(PK) 和 food_name 的食物。 我已经在 table
上有了这些数据food_id|food_name
-----------------
0000001|food1
0000002|food2
0000003|food3
在我的 csv 上
0000001|apple
0000004|banana
0000005|grape
如果没有重复的 PK,这是我的查询
copy foodfrom 'd:\testingfood.csv' delimiter '|' csv
但我想将 food1 更新为 apple 到 apple 并插入 0000004|banana 和 0000005|grape?
可能吗?
您不能在单个 COPY
命令中完成此操作。使用临时 table 和 INSERT
与 ON CONFLICT
,例如:
create temp table tmp_food (like food); -- create temporary table like food
copy tmp_food from 'd:\testingfood.csv' delimiter '|' csv; -- copy to temp table
insert into food (food_id, food_name) -- insert into food from temp table
select food_id, food_name
from tmp_food
on conflict (food_id) do -- update instead of error
update set food_name = excluded.food_name;
drop table tmp_food; -- drop temp table