PostgreSQL中如何用同表不同行值更新列并修改键名
PostgreSQL适配解决方案
需求与表结构
当前表结构:
| id | Key | Value |
|---|---|---|
| 1 | property1 | value11 |
| 1 | oldvalue | oValue1 |
| 1 | newvalue | nValue1 |
| 2 | property1 | value12 |
| 2 | oldvalue | oValue2 |
| 2 | newvalue | nValue2 |
| 3 | property1 | value13 |
| 3 | oldvalue | oValue3 |
| 3 | newvalue | nValue3 |
新增Previous Value列后,目标表结构:
| id | Key | Value | Previous Value |
|---|---|---|---|
| 1 | property1 | value11 | null |
| 1 | value | nValue1 | oValue1 |
| 2 | property1 | value12 | null |
| 2 | value | nValue2 | oValue2 |
| 3 | property1 | value13 | null |
| 3 | value | nValue3 | oValue3 |
需要完成的操作:
- 将同
id下oldvalue键的Value复制到newvalue键的Previous Value列(仅对存在oldvalue的id执行) - 将所有
newvalue键改为value
适配PostgreSQL的SQL语句
1. 更新Previous Value列
PostgreSQL的UPDATE关联语法与SQL Server不同,需要使用UPDATE ... FROM的标准写法,同时注意字段名包含空格/大写时,必须用双引号包裹:
UPDATE PROPERTIES_TABLE t1 SET "Previous Value" = t2."Value" FROM PROPERTIES_TABLE t2 WHERE t1.id = t2.id AND t1."Key" = 'newvalue' AND t2."Key" = 'oldvalue';
2. 修改Key值
这一步语句与SQL Server兼容,直接执行即可:
UPDATE PROPERTIES_TABLE SET "Key" = 'value' WHERE "Key" = 'newvalue';
注意事项
- 必须先执行更新
Previous Value的语句,再修改Key值,否则修改Key后无法匹配到newvalue的行,导致更新失败。 - 如果你的字段名是全小写且无空格(比如
previous_value、key、value),可以去掉双引号,PostgreSQL会自动识别。
内容的提问来源于stack exchange,提问作者John Silva
相关产品推荐
相关产品推荐

