PostgreSQL冲突时如何实现字段值不匹配时追加更新
解决方案
你需要修改ON CONFLICT子句中bio字段的更新逻辑,核心是判断新旧bio值是否相同,不同则按规则追加内容,相同则保留原值。
修改后的SQL语句
INSERT INTO main_parse_user ("user_id","group_id", "username","bio", "first_name") VALUES (%s,%s,%s,%s,%s) ON CONFLICT (user_id) DO UPDATE SET group_id = EXCLUDED.group_id, username = EXCLUDED.username, bio = CASE -- 新旧值相同,保留原值 WHEN EXCLUDED.bio = main_parse_user.bio THEN main_parse_user.bio -- 原bio为空,直接使用新值(兼容原有逻辑) WHEN main_parse_user.bio IS NULL THEN EXCLUDED.bio -- 新旧值不同,按示例格式追加新值的差异部分 ELSE main_parse_user.bio || ' | ' || substring(EXCLUDED.bio from length(main_parse_user.bio) + 1) END, first_name = EXCLUDED.first_name
逻辑说明
- 相同值处理:当新传入的
bio与数据库已有bio完全一致时,不做改动,保留原值。 - 原值为空处理:如果数据库中原有
bio是空值,直接替换为新传入的bio,延续你原本的逻辑。 - 不同值追加:按照你给出的示例,提取新值中超出旧值长度的部分,用
|分隔后追加到旧值末尾。
如果你的实际需求是将新旧完整值拼接(比如旧值qwerty、新值qwerty1时结果为qwerty | qwerty1),可将CASE中的对应分支修改为:
ELSE main_parse_user.bio || ' | ' || EXCLUDED.bio
内容的提问来源于stack exchange,提问作者Qadyr Israfilov
相关产品推荐
相关产品推荐

