Sql 更新jsonb对象以包含父行中的键/值

Sql 更新jsonb对象以包含父行中的键/值,sql,json,postgresql,Sql,Json,Postgresql,我有一个带有id列和jsonb列的表 我想更新每一行上的jsonb对象,以包含“parent”行的id值 按如下方式创建我的设置: CREATE TABLE people ( id serial PRIMARY KEY, meta jsonb ); insert into people (meta) values ('{"age": 10}'), ('{"age": 15}'), ('{"age": 20}') ; id meta 1 {"

我有一个带有id列和jsonb列的表

我想更新每一行上的jsonb对象,以包含“parent”行的id值

按如下方式创建我的设置:

CREATE TABLE people ( 
    id serial PRIMARY KEY,
    meta jsonb
);


insert into people (meta) values 
    ('{"age": 10}'),
    ('{"age": 15}'),
    ('{"age": 20}')
;
id  meta
1   {"id": 1, "age": 10}
2   {"id": 2, "age": 15}
3   {"id": 3, "age": 20}
其结果是:

id  meta
1   {"age": 10}
2   {"age": 15}
3   {"age": 20}
我想迁移数据,使其看起来像这样:

CREATE TABLE people ( 
    id serial PRIMARY KEY,
    meta jsonb
);


insert into people (meta) values 
    ('{"age": 10}'),
    ('{"age": 15}'),
    ('{"age": 20}')
;
id  meta
1   {"id": 1, "age": 10}
2   {"id": 2, "age": 15}
3   {"id": 3, "age": 20}
博士后版本:10.7


我使用了一个子查询,但效果不太好。谢谢你的帮助

使用
jsonb\u build\u object()
然后将结果连接到现有的
jsonb
对象:

SELECT meta || jsonb_build_object('id', id)
FROM people;
要实际更新,请执行以下操作:

UPDATE people
SET meta = meta || jsonb_build_object('id', id);
通常,在JSON对象中冗余存储ID没有多大意义。但你似乎有你的理由

相反,
jsonb
中删除一个(顶级!)键更简单:

SELECT meta - 'id' FROM people;
或:

jsonb
作为左操作数和
text
作为右操作数的
-
运算符为:

从左操作数中删除键/值对或字符串元素。键/值对根据其键值进行匹配


如果没有名为“id”的键,或者您得到的是
NULL
,这对于notnull列来说是不合法的…

为什么要复制
id
列中的数据?这是一个虚构的例子@a_horse_,没有名称,我只是想简化我的问题。实际上,我想将一个键从“parent”行移动到“child”元中,然后将其从“parent”行中删除。我最终将把meta移到一个新的表中,尽管我已经意识到这不是正确的方式。那太好了,谢谢。我能问一下你会怎么做相反的事情吗?(在子jsonb列的父行中设置一个值)@JMurphyWeb:I在上面添加了反向操作。谢谢