Postgresql:使用存储过程的JSON参数插入两个具有有效FK的表
我有以下两个表格:Postgresql:使用存储过程的JSON参数插入两个具有有效FK的表,postgresql,jsonb,Postgresql,Jsonb,我有以下两个表格: CREATE TABLE tableone ( id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ), sampletextone text ); CREATE TABLE tabletwo ( id integer NOT NULL GENE
CREATE TABLE tableone (
id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
sampletextone text
);
CREATE TABLE tabletwo (
id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
tableone_id int,
sampletexttwo text
);
将以下JSON
参数发送到过程:
[
{
"sampletextone": "table one text 1",
"tabletwo":
[
{
"sampletexttwo": "table two sample one text 1"
},
{
"sampletexttwo": "table two sample one text 2"
}
]
},
{
"sampletextone": "table one text 2",
"tabletwo":
[
{
"sampletexttwo": "table two sample one text 3"
},
{
"sampletexttwo": "table two sample one text 4"
}
]
}
]
我有以下存储过程
CREATE OR REPLACE procedure testproc(jsonparam json)
AS
$BODY$
WITH ins1 AS (INSERT INTO "tableone" ("sampletextone")
SELECT prop->>'sampletextone'
FROM json_array_elements(jsonparam) prop
Returning "id"
)
INSERT INTO "tabletwo" ("tableone_id", "sampletexttwo")
SELECT ins1."id", 'should be all sample text two'
FROM ins1
--JOIN json_array_elements(jsonparam) prop;
$BODY$
LANGUAGE sql;
我试图再次加入JSON
参数,用tableone
中的正确外键插入tabletwo
中的所有四行。我不确定再次加入相关数据的最佳方式是什么
更新:
CREATE OR REPLACE procedure testproc(jsonparam json)
AS
$BODY$
WITH ins1 AS (INSERT INTO "tableone" ("sampletextone")
SELECT prop->>'sampletextone'
FROM json_array_elements(jsonparam) prop
Returning "id", "sampletextone"
)
INSERT INTO "tabletwo" ("tableone_id", "sampletexttwo")
SELECT ins1."id", json_extract_path(prop, 'tabletwo', 'sampletexttwo')
FROM ins1
JOIN json_array_elements(jsonparam) prop ON prop->>'sampletextone' =
ins1."sampletextone"
$BODY$
LANGUAGE sql;
更新后的
存储过程
仅在表2中创建了2行,外键正确,而不是4行,sampletextwo
为空我找到了答案
CREATE OR REPLACE procedure testproc(jsonparam json)
AS
$BODY$
WITH ins1 AS (INSERT INTO "tableone" ("sampletextone")
SELECT prop->>'sampletextone'
FROM json_array_elements(jsonparam) prop
Returning "id", "sampletextone"
)
INSERT INTO "tabletwo" ("tableone_id", "sampletexttwo")
SELECT ins1."id", json_array_elements(json_extract_path(prop, 'tabletwo'))->>'sampletexttwo'
FROM ins1
JOIN json_array_elements(jsonparam) prop ON prop->>'sampletextone' =
ins1."sampletextone"
$BODY$
LANGUAGE sql;
如果有更好的方法,请告诉我