postgresql - postgres upsert json Prop

标签 postgresql unique jsonb upsert postgresql-9.6

我不确定这是否可能,但我正在尝试深入了解我在 postgres 9.6.1 中可以做什么,这似乎是可能的。所以给定这张表:

DROP TABLE IF EXISTS live_data;
CREATE TABLE live_data (
rec_id TEXT,
control_data JSONB
);
CREATE UNIQUE INDEX rec_id_idx ON live_data (rec_id);

我希望能够在 control_data json 上插入单个 Prop ,而不必插入一个全新的 json 字符串。

该表中没有行,但我试过这个:

INSERT INTO live_data(rec_id, control_data) VALUES ('1', '{"set":{"some_prop": 99}}')
ON CONFLICT (rec_id) DO UPDATE SET control_data->'set'->'some_prop' = 99;

FWIW 我在该查询中收到此错误:

syntax error at or near "->"

我是否写错了查询和/或我想做的事情目前不可能?

最佳答案

使用jsonb_set() :

INSERT INTO live_data(rec_id, control_data) 
VALUES ('1', '{"set":{"some_prop": 99}}');

INSERT INTO live_data(rec_id, control_data) 
VALUES ('1', '{"set":{"some_prop": 88}}')
ON CONFLICT (rec_id) DO 
UPDATE SET control_data = 
    jsonb_set(live_data.control_data, array['set','some_prop'], '88', true)
RETURNING *;

 rec_id |        control_data        
--------+----------------------------
 1      | {"set": {"some_prop": 88}}
(1 row)

关于postgresql - postgres upsert json Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42567972/

相关文章:

xml - xsd 唯一选择器路径 : exclude specific elements

python - 使用 Python 在具有 JSON 列的表上测试 Postgresql 查询

ruby-on-rails - 从 Rails 5 模型访问 jsonb 列和属性

sql - 如何在 postgres INSERT ON CONFLICT DO UPDATE 中返回列的旧值?

sql - PostgreSQL:唯一约束或唯一索引

javascript - 为什么我不能在此代码段中生成唯一对象数组?

php - php array_unique 的奇怪行为

PostgreSQL 9.6 : pgadmin4 is not opening on localhost:5050 (Ubuntu 16. 04)

ruby-on-rails - 没有找到主要的连接池

sql - 为什么不使用 GIN 索引?