postgresql - Postgresql:使用存储过程的 JSON 参数插入具有有效 FK 的两个表
问题描述
我有以下两个表:
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"
}
]
}
]
我有以下stored procedure
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
插入所有四行。我不确定再次加入相关数据的最佳方式是什么。tabletwo
tableone
更新:
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;
使用正确的外键而不是 4创建更新的stored procedure
仅 2 行并且为空tabletwo
sampletexttwo
解决方案
我找到了答案
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;
如果有更好的方法,请告诉我
推荐阅读
- azure - 使用 ADB2C 和共享的 Auth Cookie 在 Azure 应用服务上获取无限重定向循环
- powerbi - 如何在 Power BI 中为每个日历月生成日历表并使其从今天停止
- p5.js - 我想一次绘制一个数组 data[6] 的每个映射索引
- ravendb-studio - 如何在 RQL 中查询 $type 等属性路径表达式中的特殊字符,如 $
- javascript - Highcharter R 包:在进行拖动选择后防止图表上的缩放事件
- .net - 配置 Jenkins 以在 Linux 平台上运行 MSBuild
- ruby-on-rails - 使用 Bulma 将 Rails 部署到 Heroku
- r - 有没有一种整洁的方法来改变小标题中的单个细胞?
- angular - 如何使用 ag-grid 显示特定的无行覆盖?
- python - 在 python 中的 loadtxt() 中将变量作为路径传递