PostgreSQL中未知字段时克隆记录并修改指定字段的实现方法
克隆PostgreSQL表记录并修改指定字段(测试数据生成)
嘿,我猜你是已经写出了查询语句,但还没搞定把生成的克隆记录实际插入到表中对吧?毕竟光用SELECT只能看到结果,没法真正生成测试数据~
先确认一下你的基础思路是对的:json_populate_record确实能帮你基于原有记录生成新的记录对象,再通过json_object替换指定字段的值。不过要把这个结果变成表中的实际数据,需要把它嵌套进INSERT语句里。
单条克隆记录插入
直接用INSERT + SELECT的组合就能搞定,这里给你调整后的完整语句:
INSERT INTO my_table SELECT json_populate_record(null::my_table, json_build_object('id_table', 2000)) FROM my_table WHERE id_table = 1;
- 这里用
null::my_table来指定要生成的记录类型和表结构匹配,比你原来的my_table写法更规范; json_build_object比json_object(ARRAY[...]的写法更直观,当然你原来的写法也能正常运行,只是可读性稍差一点。
执行这条语句后,你的my_table里就会多出一条和id=1完全一致,仅id_table字段为2000的记录了。
批量生成测试数据
如果需要一次性生成多条不同的克隆记录(比如造10条测试数据),可以结合generate_series来自动生成不同的字段值:
INSERT INTO my_table SELECT json_populate_record(null::my_table, json_build_object('id_table', 2000 + s)) FROM my_table, generate_series(1, 10) s WHERE id_table = 1;
这条语句会生成id_table从2001到2010的10条克隆记录,完美满足批量造测试假数据的需求。
补充:如果表有自增主键
要是你的id_table是自增类型(比如serial或identity),那其实不需要手动指定值,直接排除这个字段,用常规的INSERT SELECT就能克隆:
INSERT INTO my_table (column1, column2, column3) -- 列出除自增id外的所有字段 SELECT column1, column2, column3 FROM my_table WHERE id_table = 1;
不过你的场景是要主动修改指定字段,所以前面的json方法更贴合你的需求。
内容的提问来源于stack exchange,提问作者Gabriel Furstenheim
相关产品推荐
相关产品推荐

