PostgreSQL:从json向表中插入数据
现在我使用手动将json解析为插入字符串,如下所示PostgreSQL:从json向表中插入数据,json,postgresql,insert,Json,Postgresql,Insert,现在我使用手动将json解析为插入字符串,如下所示 insert into Table (field1, field2) values (val1, val2) 但从json插入数据的方式并不舒服! 我找到了函数json\u populate\u record并尝试使用它: create table test (id serial, name varchar(50)); insert into test select * from json_populate_record(NULL::test
insert into Table (field1, field2) values (val1, val2)
但从json插入数据的方式并不舒服!
我找到了函数json\u populate\u record并尝试使用它:
create table test (id serial, name varchar(50));
insert into test select * from json_populate_record(NULL::test, '{"name": "John"}');
但失败的消息是:列“id”中的null值违反了notnull约束
PG知道id是序列号,但假装是个傻瓜。对于所有具有默认值的FIED也是如此
将json中的数据插入到表中是否有更优雅的方法?对于
json\u populate\u record
来说,返回表示“生成此值”的标记并不容易
PostgreSQL不允许您插入NULL
来指定应生成的值。如果你问NULL
Pg的意思是NULL
,不想再猜你。此外,生成一个没有notnull
约束的列是完全可以的,在这种情况下,可以将NULL
插入其中
如果要让PostgreSQL使用表默认值,有两种方法:
- 从
列列表中省略该行;或插入
- 显式写入
,该值仅在默认值
表达式中有效值
值(默认值,…)
,因此您唯一的选择是从插入列列表中省略该列:
regress=# create table test (id serial primary key, name varchar(50));
CREATE TABLE
regress=# insert into test(name) select name from json_populate_record(NULL::test, '{"name": "John"}');
INSERT 0 1
是的,这意味着您必须列出列。实际上,有两次,一次在选择
列表中,一次在插入
列列表中
为了避免这种需要,PostgreSQL需要有一种方法将DEFAULT
指定为记录的值,因此json\u populate\u record
可以为未定义的列返回DEFAULT
,而不是NULL
。这可能不是您对所有列的预期,并且会导致在INSERT
表达式中未使用json\u populate\u record
时如何处理DEFAULT
的问题
因此,我猜json\u populate\u record
可能没有您希望的具有生成键的行有用。继续,您可能需要编写某种存储过程来执行必要的动态SQL,如下所示:
创建或替换函数jsoninsert(relname text,reljson text)
将记录返回为
$BODY$DECLARE
ret记录;
输入字符串文本;
开始
在inputstring中选择string_agg(quote_ident(键),',')
从json_对象_键(reljson::json)作为X(键);
执行“插入”| | quote_ident(relname)
||“(“| |输入字符串| |”)选择“| |输入字符串”
||'从json_填充_记录(NULL::'| | quote_ident(relname)| |',json_in($1))返回*'
使用reljson::cstring进入ret;
返回ret;
结束;
$BODY$
语言plpgsql;
然后你会打电话给他
选择jsoninsert('test','{“name”:“John”}');
“我找到了函数json\u populate\u record
”。嗯。哪里函数定义是什么?您是在运行PostgreSQL 9.3测试版,还是在其他地方安装的功能?它是9.3测试版的功能,非常酷。有没有一种方法可以基于json输入更新?@jney我真的不知道你在问什么。我建议发布一个新的适当详细的问题,并链接回这个问题以了解上下文。非常有用的信息(关于json\u populate\u record
的文档有点稀疏)。但是,似乎确实有一个很好的例子来说明“如果没有指定值,则使用默认值”的效果。