增量JSONB更新:利用路径操作符避免全字段重写
大多数教程只介绍JSONB的简单存取,本主题深入PostgreSQL 16+的jsonb_set与路径操作符,展示如何只更新深层嵌套的键而不影响其他字段,同时解决并发更新丢失问题。 · 难度:入门 · +10XP
增量JSONB更新:利用路径操作符避免全字段重写
直接更新JSONB列时,许多开发者会取出整个JSONB对象、修改再写回,这在高并发场景下会导致lost update。PostgreSQL的jsonb_set函数配合路径操作符(如'{a,b,c}')可以实现原地增量更新,仅重写受影响的部分。本教程将演示如何对嵌套JSON执行增、删、改操作(jsonb_set, jsonb_insert, #- 删除),并利用行锁(SELECT FOR UPDATE)在不丢失其他字段修改的前提下安全更新。最后比较全量更新与增量更新的性能与MVCC行为差异。
-- 增量更新嵌套键
UPDATE users SET metadata = jsonb_set(
metadata,
'{preferences, theme}',
'"dark"',
true -- 如果键不存在则创建
) WHERE id = 1;
-- 并发安全写法
UPDATE users SET metadata = jsonb_set(metadata, '{preferences, theme}', '"dark"')
WHERE id = 1 AND (metadata->'preferences'->>'theme') IS DISTINCT FROM 'dark';