18

今、私は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" の null 値は非 null 制約に違反しています PG は id がシリアルであることを知っていますが、ふりをしています。デフォルトのすべてのフィールドで同じことが行われます。

JSONからテーブルにデータを挿入するためのよりエレガントなvayはありますか?

4

2 に答える 2

18

json_populate_record「この値を生成する」ことを意味するマーカーを返す簡単な方法はありません。

PostgreSQL では、値を生成する必要があることを指定するために挿入することはできません。NULLあなたが尋ねるなら、NULLPgはあなたを意味 NULLすることを期待しており、あなたを二度目に推測したくありません. さらに、NOT NULL制約のない生成された列を使用しても問題ありません。その場合、列に挿入NULLしてもまったく問題ありません。

PostgreSQL にテーブルのデフォルト値を使用させたい場合、これを行うには 2 つの方法があります。

  • INSERTcolumn-listからその行を省略します。また
  • 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リストで 1 回、INSERT列リストで 1 回、2 回です。

その必要性を回避するために、この PostgreSQL はDEFAULTレコードの値として指定する方法が必要になるため、定義されていない列の代わりにjson_populate_record返すことができます。これは、すべての列に対して意図したものではない可能性があり、 が式で使用されていない場合にどのように扱われるかという問題につながる可能性があります。DEFAULTNULLDEFAULTjson_populate_recordINSERT

そのjson_populate_recordため、生成されたキーを持つ行に期待したほど役に立たないかもしれません。

于 2013-07-28T13:34:31.650 に答える