加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL:将数据从json插入表中

发布时间:2020-12-13 16:32:13 所属栏目:百科 来源:网络整理
导读:现在我用来手动解析json到插入字符串 insert into Table (field1,field2) values (val1,val2) 但它不舒服的方法从json插入数据! 我发现函数json_populate_record并尝试使用它: create table test (id serial,name varchar(50));insert into test select *
现在我用来手动解析json到插入字符串
insert into Table (field1,field2) values (val1,val2)

但它不舒服的方法从json插入数据!
我发现函数json_populate_record并尝试使用它:

create table test (id serial,name varchar(50));
insert into test select * from json_populate_record(NULL::test,'{"name": "John"}');

但是它失败并显示消息:列“id”中的空值违反非空约束
PG知道id是连续的,但是假装是一个傻瓜.与所有违禁品相同.

有没有更优雅的选择将数据从json插入到表中?

json_populate_record没有简单的方法返回一个表示“生成此值”的标记.

PostgreSQL不允许您插入NULL来指定应该生成一个值.如果您要求NULL Pg期望为NULL并且不希望猜测您.另外还有一个没有NOT NULL约束的生成列是完全可以的,在这种情况下,将NULL插入到它是非常好的.

如果你想让PostgreSQL使用表的默认值来实现这一点:

>从INSERT列列表中省略该行;要么
>明确地写入DEFAULT,它只在VALUES表达式中有效

由于您不能在此使用VALUES(DEFAULT,…),您唯一的选择是从INSERT列列表中省略列:

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

是的,这意味着你必须列出列.两次,其实一次在SELECT列表中,一次在INSERT列列表中.

为了避免PostgreSQL需要一种将DEFAULT指定为记录的值的方式,因此对于未定义的列,json_populate_record可能返回DEFAULT而不是NULL.这可能不是您对所有列的打算,并且会导致在json_populate_record未被用于INSERT表达式时如何处理DEFAULT的问题.

所以我猜json_populate_record可能不如你希望使用生成的键的行有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读