首页 > 解决方案 > pg_dump 插入按主键排序的 SQL 文件

问题描述

我正在使用以下命令从数据库中提取表:

pg_dump -U postgres --column-inserts --data-only --table=<mytable> <mydb> > <mytablev2>.sql

这会创建一个包含 INSERT 语句的 .sql 文件来重新创建我的表。我遇到的唯一问题是它没有按主键的顺序对数据进行排序。这是一个较新版本的表,我希望我的行按主键顺序排列,以便更轻松地跟踪版本之间的更改。是否有可能做到这一点?

标签: sqlpostgresql

解决方案


为了效率起见pg_dump,只需根据数据在磁盘上的存储方式转储数据。如果您想对转储文件进行排序或使用类似diff. 我认为实现这一点的唯一方法是创建另一个具有排序值的表:

postgres=# create table teller2 as SELECT * FROM pgbench_tellers order by tid;
SELECT 10
postgres=# \q
-bash-4.2$ pg_dump -U postgres --column-inserts --data-only --table=teller2    
<...snip...>
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (1, 1, -58378, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (2, 1, 160826, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (3, 1, 21714, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (4, 1, -74568, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (5, 1, 21023, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (6, 1, -80872, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (7, 1, -26181, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (8, 1, -78087, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (9, 1, 43505, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (10, 1, -225725, NULL);

我知道当您处理数百万行时,这可能无法很好地扩展。我能想到的唯一其他选择需要更多的编码和 Postgres 如何工作的低级知识——基本上,我建议使用pg_waldump或逻辑解码来创建一些工具来跟踪你的更改(但这不会满足你原来的如何对pg_dump输出进行排序的问题)。


推荐阅读