PostgreSQL中合并相似表并调整rank字段的正确查询方法
解决PostgreSQL合并两表并调整rank的问题
你的需求是把Pris表的数据合并到Prix表,同时让新插入数据的rank从Prix当前最大rank开始依次递增——这也是你第二个尝试语句失败的核心原因:
ON CONFLICT(rank) SET rank=rank+10 逻辑错误,ON CONFLICT DO UPDATE是用来更新已存在的冲突行,但你不能在更新操作中修改主键字段(rank),而且你的目标是插入新行,不是修改原有行。
正确的实现语句
直接计算Pris每条数据需要的新rank,再插入到Prix:
INSERT INTO Prix (rank, value) SELECT (SELECT COALESCE(MAX(rank), 0) FROM Prix) + p.rank, p.value FROM Pris p;
语句说明
(SELECT COALESCE(MAX(rank), 0) FROM Prix):获取Prix当前最大的rank值,用COALESCE处理Prix为空的边界情况(如果Prix没有数据,就从0开始累加)。- 给Pris的每条数据的rank加上这个最大值,就能得到连续递增的新rank(比如你示例里Prix最大rank是2,Pris的rank1变成3,rank2变成4)。
- 因为两个表的
value都是唯一约束,且示例中Pris的value和Prix不重复,所以插入不会触发value的冲突报错。
验证结果
执行后Prix表的数据就会变成你想要的:
| rank | value |
|---|---|
| 1 | 1229 |
| 2 | 1993 |
| 3 | 2719 |
| 4 | 3547 |
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

