通过查看Postgres9.4数据类型JSONB的文档,我并不清楚如何对JSONB列进行更新
JSONB类型和功能的文档:
http://www.postgresql.org/docs/9.4/static/functions-json.html
http://www.postgresql.org/docs/9.4/static/datatype-json.html
作为示例,我有以下基本表结构:
创建表测试(id序列,数据jsonb);
插入很容易,如:
插入测试(数据)值(“{”名称“:“我的名字”,“标记“:[“tag1”,“tag2”]}”);
现在,我如何更新“数据”列?这是无效的语法:
更新测试集数据->;'名称“=”我的其他名称“,其中id=1;
这是不是记录了我错过的某个明显的地方?谢谢
如果您能够升级到Postgresql 9.5,则可以使用jsonb_set命令,正如其他人所提到的
在下面的每个SQL语句中,为了简洁起见,我省略了where子句;很明显,你会想把它加回去
更新名称:
更新测试集数据=jsonb_集(数据,{name},”my other name’);
更换标签(与添加或删除标签相反):
更新测试集数据=jsonb_集(数据,{tags},'[“tag3”,“tag4”]);
替换第二个标记(0索引):
更新测试集数据=jsonb_集(数据,{tags,1}’,tag5’);
追加一个标记(,只要标记少于999个,这将起作用;将参数999更改为1000或更高会产生错误。。Postgres 9.5.3中不再出现这种情况;可以使用更大的索引):
更新测试集数据=jsonb_集(数据,{tags,999999999},'tag6',true);
删除最后一个标记:
更新测试集数据=数据#-'{tags,-1}'
复杂更新(删除最后一个标记,插入新标记,并更改名称):
更新测试集数据=jsonb\u集(
jsonb_集(数据#-'{tags,-1}','{tags,99999999}',''tag3',true),
"{name},"我的另一个名字";;
需要注意的是,在这些示例中,实际上并没有更新JSON数据的单个字段。相反,您将创建一个临时的、修改过的数据版本,并将该修改过的版本分配回列。在实践中,结果应该是相同的,但记住这一点应该使复杂的更新(如上一个示例)更容易理解
在这个复杂的示例中,有三个转换和三个临时版本:首先,删除最后一个标记。然后,通过添加新标记来转换该版本。接下来,通过更改名称字段来转换第二个版本。数据列中的值将替换为最终版本