【发布时间】:2014-11-25 12:52:27
【问题描述】:
这是“Populate multiple tables from a single JSON object with json_populate_recordset”的后续问题。
假设我的表 (table_a, table_b) 有 a_id 和 b_id 的序列, 所以它们看起来像这样:
CREATE TABLE table_a (a_id serial, b_id integer, c_id integer);
CREATE TABLE table_b (b_id serial, name text, z_id integer);
...
CREATE TABLE table_z (z_id serial, some_text_entry text);
一个像这样的常规插入
INSERT INTO table_a (b_id, c_id) values (1, 2);
INSERT INTO table_b (name, z_id) values ("whatever", 3);
...
INSERT INTO table_z (some_text_entry) values ("Some text");
让 PostgreSQL 增加 a_id (table_a)、b_id(table_b) 等的 id,以便可以创建和存储新数据集。
但是我怎样才能使用以下更复杂的方法插入数据并仍然获得自动创建的 ID?
WITH input AS (
SELECT '{
"tablename_a":[{"a_id":1,"b_id":2,"c_id":3},
{"a_id":2,"b_id":51,"c_id":3}],
"tablename_b":[{"b_id":2,"name":"John Doe", "z_id":123},
{"b_id":51,"name":"Mary Ann", "z_id":412}],
"tablename_z":[{"z_id":123, "some_text_entry":"Something"},
{"z_id":123, "some_text_entry":"Something else"}]
}'::json AS j
)
, a AS (
INSERT INTO tablename_a
SELECT t.*
FROM input i
, json_populate_recordset(NULL::tablename_a, i.j->'tablename_a') t
)
, b AS (
INSERT INTO table_b
SELECT t.*
FROM input i
, json_populate_recordset(NULL::tablename_b, i.j->'tablename_b') t
)
-- ... more ...
INSERT INTO tablename_z
SELECT t.*
FROM input i
, json_populate_recordset(NULL::tablename_z, i.j->'tablename_z') t
;
如果我只是将 id 设置为 null
"tablename_a":[{"a_id": null,"b_id":2,"c_id":3},
{"a_id": null,"b_id":51,"c_id":3}]
或者像这样省略各自的ID:
"tablename_a":[{"b_id":2,"c_id":3},
{"b_id":51,"c_id":3}]
我收到错误“a_id”列中的空值违反非空约束。
另外: 如果有办法解决这个问题,而不是专门列出所有列名(序列名除外),那就太好了。
如果你在 MySQL 中使用我的 table_a,我知道你可以做类似的事情
INSERT INTO table_a VALUES (1,2)
意味着 MySQL 将使用自动增量 id 填充 a_id 字段,其余部分使用插入命令给出的数据。用json也没有办法做到这一点吗?
【问题讨论】:
标签: sql json postgresql