在这篇文章中,我们将带领您了解如何在Postgres9.4中对JSONB类型的列执行更新操作的全貌,包括postjson数据的相关情况。同时,我们还将为您介绍有关Postgresql9.4JSONB类
在这篇文章中,我们将带领您了解如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作的全貌,包括postjson数据的相关情况。同时,我们还将为您介绍有关Postgresql 9.4 JSONB类型,按日期范围选择、PostgreSQL 9.4 RC1 发布,JSONB 数据类型、postgreSql jsonb 类型、postgresql – postgres jsonb_set多个密钥更新的知识,以帮助您更好地理解这个主题。
本文目录一览:- 如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作(postjson数据)
- Postgresql 9.4 JSONB类型,按日期范围选择
- PostgreSQL 9.4 RC1 发布,JSONB 数据类型
- postgreSql jsonb 类型
- postgresql – postgres jsonb_set多个密钥更新
如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作(postjson数据)
查看 Postgres 9.4 数据类型 JSONB 的文档,对我来说如何对 JSONB 列进行更新并不是很明显。
JSONB 类型和函数的文档:
http://www.postgresql.org/docs/9.4/static/functions-json.htmlhttp://www.postgresql.org/docs/9.4/static/datatype-
json.html
例如,我有这个基本的表结构:
CREATE TABLE test(id serial, data jsonb);
插入很容易,如下所示:
INSERT INTO test(data) values (''{"name": "my-name", "tags": ["tag1", "tag2"]}'');
现在,我将如何更新“数据”列?这是无效的语法:
UPDATE test SET data->''name'' = ''my-other-name'' WHERE id = 1;
这是否记录在我错过的明显地方?谢谢。
答案1
小编典典理想情况下,不要将 JSON 文档用于要在关系数据库中操作的结构化常规数据。请改用 规范化关系设计 。
JSON 主要用于存储不需要在 RDBMS 中操作的整个文档。有关的:
- 带索引的 JSONB 与 hstore
在 Postgres 中更新一行总是写入 整 行的新版本。这就是Postgres 的 MVCC
模型的基本原理。从性能的角度来看,您是更改 JSON 对象中的单个数据还是更改所有数据都无关紧要:必须编写行的新版本。
因此手册中的建议:
当存储在表中时,JSON 数据与任何其他数据类型一样受到相同的并发控制注意事项。尽管存储大文档是可行的,但请记住,任何更新都会获取整行的行级锁。考虑将
JSON 文档限制在可管理的大小,以减少更新事务之间的锁争用。理想情况下,每个 JSON
文档都应该代表一个原子数据,业务规则规定不能合理地进一步细分为可以独立修改的较小数据。
它的要点:要修改JSON 对象中的 任何内容 ,您必须将修改后的对象分配给列。json
除了存储能力之外,Postgres
还提供了有限的方法来构建和操作数据。自 9.2 版以来,随着每个新版本的发布,工具库都大幅增加。但是原则仍然存在:您 总是
必须将一个完整的修改对象分配给列,并且 Postgres 总是为任何更新写入一个新的行版本。
如何使用 Postgres 9.3 或更高版本的工具的一些技巧:
- 如何修改新 PostgreSQL JSON 数据类型中的字段?
Postgresql 9.4 JSONB类型,按日期范围选择
SELECT * FROM stations WHERE date >= '2014-02-01' AND date < '2014-03-01 AND station = 'AA01'
但我不知道如何使用JSONB数据类型查询数据库.
CREATE TABLE stations ( id SERIAL PRIMARY KEY,event JSONB ); INSERT INTO test(event) VALUES('{"station":"AA01","value":2.31,"date":"2015-01-23 18:02:48.906569865 +0000 UTC"}'); INSERT INTO test(event) VALUES('{"station":"AA02","value":4.1,"date":"2015-01-23 19:02:48.906569865 +0000 UTC"}');
另外,我想知道如何获得良好的性能方法,谢谢.
SELECT * FROM stations WHERE to_date(event->>'date','YYYY-MM-DD') BETWEEN '2014-02-01' AND '2014-03-01' AND event->>'station' = 'AA01';
PostgreSQL 9.4 RC1 发布,JSONB 数据类型
PostgreSQL 9.4 RC1 发布,此版本现已提供下载,文档请前往这里查看。
主要更新内容请看:
Allow materialized views to be refreshed without blocking reads
Add support for logical decoding of WAL data, to allow database changes to be streamed out in a customizable format
Allow background worker processes to be dynamically registered, started and terminated
Add jsonb, a more capable and efficient data type for storingJSONdata
Add newSQLcommand ALTER SYSTEM for updating postgresql.conf configuration file entries
Reduce lock strength for some ALTER TABLE commands
更多内容请看:Postgres 9.4 重要特性:jsonb 数据类型
完整改进内容请看发行说明,其他描述或者最新特性请看 9.4 Features Wiki Page。
PostgreSQL 依赖于社区帮忙测试下一个版本,保证其高性能的特性。更多测试相关信息请看这里。
postgreSql jsonb 类型
JAVA 对应实体类型 为Object,在返回此值时,会将此值生成一个JSON 数据,自动生成 {"type":jsonb,"value":{数据}} 如果不想要此格式,在实体get方法里 public Object getIdPayRule() { if(null!=data){ return JSONObject.parse(String.valueOf(data)); } return data; } 用了postgresql,在做插入时,一定要掌握数据类型转义操作符 :: 如 insert into t1(id,json,jsonb) values(1,'{"bar": "baz","balance": 7.77,"active":false}'::json,"active":false}'::jsonb)postgresql – postgres jsonb_set多个密钥更新
number | data 1 | {"name": "firstName","city": "toronto","province": "ON"}
我需要一种更新数据列的方法.
所以我的输出应该是这样的:
{"name": "firstName","city": "ottawa","province": "ON","phone": "phonenum","prefix": "prefixedname"}
json_set可以吗?
我添加了如下查询:
update table_name set data = jsonb_set(data,'{city}','"ottawa"') where number = 1;
但是,我需要一种方法来添加新的键值(如果它不存在)并更新键值(如果它存在).是否可以在单个查询中实现此目的?
The || operator concatenates the elements at the top level of each of its operands. … For example,if both operands are objects with a common key field name,the value of the field in the result will just be the value from the right hand operand.
所以使用你的示例数据:
update table_name set data = data || '{"city": "ottawa","prefix": "prefixedname"}' where number = 1;
此外,如果您要编辑的对象不在顶层 – 只需组合连接和jsonb_@R_400_5301@.例如,如果原始数据看起来像
{"location": {"name": "firstName","province": "ON"}}
然后
... data = jsonb_set(data,'{location}',data->'location' || '{"city": "ottawa","prefix": "prefixedname"}') ...
我们今天的关于如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作和postjson数据的分享就到这里,谢谢您的阅读,如果想了解更多关于Postgresql 9.4 JSONB类型,按日期范围选择、PostgreSQL 9.4 RC1 发布,JSONB 数据类型、postgreSql jsonb 类型、postgresql – postgres jsonb_set多个密钥更新的相关信息,可以在本站进行搜索。
本文标签: