PostgreSQL中如何实现行存在则更新数组、不存在则插入?
解决方案:用PostgreSQL的UPSERT实现单语句插入/更新
你完全可以用单条SQL语句实现需求,不需要拆分成两个查询。PostgreSQL提供的INSERT ... ON CONFLICT ... DO UPDATE语法(即常说的UPSERT),正好匹配你的场景:目标行存在时更新,不存在时插入。
先修正表创建语句的语法错误
你原语句里有两处小问题,修正后如下:
CREATE TABLE recipes ( profile_id TEXT NOT NULL, recipe_category TEXT NOT NULL, recipe_ids TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[], PRIMARY KEY (profile_id, recipe_category) );
实现需求的UPSERT语句
INSERT INTO recipes (profile_id, recipe_category, recipe_ids) VALUES ($2, $3, $1) ON CONFLICT (profile_id, recipe_category) DO UPDATE SET recipe_ids = array_cat(recipes.recipe_ids, $1);
语句说明
INSERT ... VALUES:尝试插入新行,参数对应关系为$2(用户ID)、$3(食谱分类)、$1(要添加的食谱ID数组)。ON CONFLICT (profile_id, recipe_category):指定冲突判断依据(你的主键组合),当该组合已存在时触发后续更新逻辑。DO UPDATE SET ...:冲突发生时执行更新,用array_cat把原有recipe_ids与新传入的$1数组拼接,实现追加效果。
这条语句既能处理首次提交分类的插入场景,也能处理已有分类的追加更新场景,一次执行即可完成操作。
内容的提问来源于stack exchange,提问作者floppy2029
相关产品推荐
相关产品推荐

