You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hasura的on_conflict过滤器时,能否仅更新已变更的值?

实现Hasura条件式Upsert(仅字段变更时更新)

你可以借助Hasura对PostgreSQL ON CONFLICT子句的扩展支持,通过excluded关键字引用本次提交的冲突行值,结合条件判断实现仅当目标字段发生变更时才执行更新的逻辑。

具体实现语法

在mutation的on_conflict配置中,放弃直接使用update_columns,改用update块定义更新逻辑,并添加where条件对比现有值与提交值:

mutation UpsertDegrees($objects: [degrees_insert_input!]!) {
  insert_degrees(
    objects: $objects,
    on_conflict: {
      constraint: degrees_key,
      update: {
        completion_year: $excluded.completion_year
      },
      where: {
        completion_year: { _neq: $excluded.completion_year }
      }
    }
  ) {
    affected_rows
  }
}

关键细节说明

  • $excluded.completion_year:PostgreSQL通过excluded别名指代冲突场景下的插入候选行,这里用来获取本次提交的completion_year值。
  • where条件:仅当数据库中现有行的completion_year与提交值不相等时,才会触发更新操作;若字段值未变更,该行会直接跳过更新流程。
  • 权限兼容:该逻辑可以和你已配置的列级权限完美配合,确保仅completion_year列能被更新。

这种方式完全在服务端完成校验,无需客户端提前过滤数据,你可以直接批量提交所有行,Hasura会自动忽略字段未变更的条目。

内容的提问来源于stack exchange,提问作者Nicolas Bouvrette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:10:31