pgsql怎么存储json
存储 JSON 数据于 PostgreSQL
在 PostgreSQL 中,支持两种用于存储 JSON 数据的原生数据类型:json
和 jsonb
。这两种类型的定义和操作方式有所不同。
创建带有 JSON 列的表格
为了创建一个能够容纳 JSON 或者 JSONB 数据的表单,可以使用如下 SQL 命令:
对于 json
类型:
CREATE TABLE example_json (
id serial PRIMARY KEY,
data json NOT NULL
);
而对于 jsonb
类型,则有稍微不同的声明方法:
CREATE TABLE example_jsonb (
id serial PRIMARY KEY,
data jsonb NOT NULL
);
插入 JSON 数据
向上述任一表中插入 JSON 数据可以通过简单的 INSERT
语句完成。这里展示了一个具体的例子来说明这一点[^3]:
INSERT INTO example_json (data) VALUES ('{"name": "Alice", "age": 28}');
INSERT INTO example_jsonb (data) VALUES ('{"city": "Beijing", "country": "China"}');
查询 JSON 数据
当涉及到检索这些表内的信息时,可以根据键名访问特定字段的内容。例如,要获取所有记录的名字属性,可执行下面这条命令:
SELECT data->>'name' AS name FROM example_json;
同样的逻辑也适用于 jsonb
表格的操作。
更新 JSON 数据
更新已存在的 JSON 文档同样简单明了。假设想要修改某个用户的年龄值,那么就可以这样做:
UPDATE example_json SET data = jsonb_set(data, '{age}', '35') WHERE id = 1;
请注意,在此上下文中使用的函数是 jsonb_set()
而不是普通的 json
函数版本,这是因为即使是在处理 json
类型的数据时,推荐的做法也是先将其转换成 jsonb
来利用更高效的索引机制和其他优化特性[^4]。
删除 JSON 数据
删除整个文档或其中的一部分也可以通过标准的SQL语法实现。比如移除一条完整的记录:
DELETE FROM example_json WHERE id = 1;
或者仅清除掉某些子项而不影响其他部分:
UPDATE example_json SET data = data #- '{address}' WHERE id = 2;
关于 json
vs. jsonb
两者之间的核心差异在于内部表示法及其对性能的影响。具体来说:
解析开销:每当读取
json
字段的时候都会重新解析其内容;而jsonb
只会在首次加载时被解析一次,并以后续二进制形式保存下来。空间效率:由于去除了重复键并规范化了白空间,通常情况下
jsonb
占用的空间会小于原始输入字符串所对应的json
版本。功能集:尽管二者都提供了丰富的查询选项,但是只有
jsonb
支持构建 GIN 索引来加速复杂路径表达式的匹配过程。
综上所述,选择哪种类型取决于实际需求——如果追求更高的灵活性以及更快捷的写入速度,应该考虑采用 json
;反之则倾向于选用经过高度优化过的 jsonb
形式来进行大规模数据分析工作负载下的高效存取活动。
相关推荐


















