postgres upsert json道具

Roo*_*ter 2 postgresql unique upsert jsonb 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);
Run Code Online (Sandbox Code Playgroud)

我希望能够在control_data json上插入各个道具而不必插入一个全新的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;
Run Code Online (Sandbox Code Playgroud)

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

syntax error at or near "->"
Run Code Online (Sandbox Code Playgroud)

我写错了这个查询和/或我想做的只是目前不可能吗?

kli*_*lin 7

用途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)
Run Code Online (Sandbox Code Playgroud)