使用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
相关产品推荐
相关产品推荐

