如何在INSERT...ON CONFLICT时仅当旧值为NULL才更新列
调整UPSERT逻辑:仅当旧bio为空时更新该字段
你原来的SQL在遇到user_id冲突时会直接用新数据覆盖所有字段,现在要实现仅当旧数据的bio为None(空值)时才更新bio字段,其他字段仍保持原覆盖逻辑,可以修改ON CONFLICT部分的SET语句,给bio字段加上条件判断:
INSERT INTO main_parse_user ("user_id","group_id", "username", "bio", "first_name") VALUES ($1,$2,$3,$4,$5) ON CONFLICT (user_id) DO UPDATE SET "group_id" = EXCLUDED.group_id, "username" = EXCLUDED.username, "bio" = COALESCE(main_parse_user.bio, EXCLUDED.bio), "first_name" = EXCLUDED.first_name
逻辑说明
COALESCE(main_parse_user.bio, EXCLUDED.bio)的作用是:优先取旧数据(main_parse_user.bio)的值,如果旧值为NULL(对应你说的None),则使用新数据(EXCLUDED.bio)的值- 其他字段(group_id、username、first_name)仍保持原逻辑,冲突时直接用新值覆盖旧值
以你给出的示例为例:
- 数据库原有数据:
12345|-10015488|@abcd|None|Dev - 插入新数据:
12345|-10015488|@abcd|Developer|Dev - 执行修改后的SQL后,bio字段会从
None更新为Developer,其余字段保持不变
内容的提问来源于stack exchange,提问作者SvatoyDyavol
相关产品推荐
相关产品推荐

