PostgreSQL如何仅更新指定列并保留其余列原有值不变
问题原因
你当前的UPDATE语句在SET子句中列出了所有字段,当不需要修改的字段对应的变量没有传入有效值时,就会被赋值为NULL,直接覆盖了原有数据。
解决方案
方案1:仅保留需要修改的字段(最优)
不需要修改的字段不要写在SET子句中,UPDATE操作默认会保留未声明字段的原有值,改写后的SQL如下:
UPDATE matches SET match_date = ${match_date}, referee_id = ${referee_id} WHERE match_id = ${match_id} RETURNING *
方案2:兼容动态修改多字段的场景
如果你的业务逻辑需要动态调整要修改的字段,比如有时候改裁判、有时候改场地,可以用COALESCE函数做兼容:当传入的变量为NULL时,自动使用字段本身的原有值,写法如下:
UPDATE matches SET match_date = COALESCE(${match_date}, match_date), referee_id = COALESCE(${referee_id}, referee_id), field_id = COALESCE(${field_id}, field_id), played = COALESCE(${played}, played), team_1_goals = COALESCE(${team_1_goals}, team_1_goals), team_2_goals = COALESCE(${team_2_goals}, team_2_goals) WHERE match_id = ${match_id} RETURNING *
注意:如果你的业务存在主动将某个字段设置为NULL的需求,该方案不适用,建议通过动态拼接SQL的方式,仅把需要修改的字段加入SET子句。
内容的提问来源于stack exchange,提问作者OscarNava84
相关产品推荐
相关产品推荐

