如何在Postgres 9.5中使pg_dump生成upsert语句

18

我想将一个数据库转储并恢复到另一个可能包含数据的数据库中。如何让pg_dump生成insert on conflict update语句而不是仅插入语句?我使用的是Postgres 9.5。


3
简短回答:你做不到。 - wildplasser
由于Postgre的限制,这在MySQL中是可能的。 - Oreoluwa
3
自2016年以来是否有任何变化可以追踪?对我现在非常有用。 - ThePartyTurtle
可能是一个重复的问题,参考链接:PostgreSQL数据库恢复使用pg_restore作为增量数据而不覆盖或删除现有表 - Stack Overflow。(结论是一样的:由于pg_dump不会生成INSERT ... ON CONFLICT ... DO UPDATE命令,所以无法直接实现。) - undefined
1个回答

18

在 PostgreSQL 12 及更高版本中,您可以使用 --on-conflict-do-nothing 开关的 pg_dump 命令。请参阅文档

示例:

$ pg_dump test --table=lifehack --section=data --column-inserts --on-conflict-do-nothing

[...]

--
-- Data for Name: lifehack; Type: TABLE DATA; Schema: public; Owner: filip
--

INSERT INTO public.lifehack (id, content) VALUES (1, 'Brush your teeth twice a day.') ON CONFLICT DO NOTHING;


--
-- PostgreSQL database dump complete
--

我花了很多时间找到这个解决方案。+50 赞同 - Masih Jahangiri
3
ON CONFLICT DO NOTHING似乎不会更新冲突的行,而只是跳过该INSERT。有人能帮忙解决如何在发生冲突时更新整行吗?类似于ON CONFLICT DO UPDATE(插入中的所有条目)。 - Yogi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接