slick-pg是否支持带RETURNING子句的批量Upsert功能?
slick-pg批量Upsert带RETURNING失败:功能未支持,非Bug
这不是Bug,是slick-pg目前不支持带RETURNING的批量Upsert功能。
原因说明
slick-pg的insertOrUpdateAll方法在结合returning使用时,底层SQL生成逻辑没有实现多行返回结果的构建逻辑。虽然PostgreSQL本身的批量Upsert(ON CONFLICT DO UPDATE)语法支持RETURNING子句,但slick-pg的InsertBuilderResult组件并未适配这种场景的多行处理,因此在SQL生成阶段就会抛出你看到的Building multi-row inserts from this InsertBuilderResult is not supported错误。
验证对比
- 不带RETURNING的批量Upsert正常:因为不需要处理返回结果的多行构建逻辑,仅执行Upsert操作即可;
- 带RETURNING的普通批量插入正常:普通多行插入的RETURNING逻辑是Slick核心库已经实现的功能,和Upsert的扩展逻辑不冲突。
替代方案
如果需要获取批量Upsert后的记录数据,有两种可行方式:
- 先执行不带RETURNING的
insertOrUpdateAll,再通过主键查询对应的记录; - 对每条记录单独执行带RETURNING的单条Upsert(性能略低,但能直接获取返回结果)。
内容的提问来源于stack exchange,提问作者silverberry
相关产品推荐
相关产品推荐

