plpgsql
函数。它尝试INSERT
一行数据,如果插入不会失败(由于键约束违规),则运行几个额外的命令。请保留HTML标记。CREATE FUNCTION foo(int, text, text)
RETURNS void AS
$$
BEGIN
INSERT INTO table1 (id, val1, val2) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING;
IF FOUND THEN
INSERT INTO table2 (table1_id, val1) VALUES ($1, $2);
UPDATE table3 SET (val2, time) = ($3, now()) WHERE table1_id = $1;
END IF;
END
$$
这个函数处理单个记录,但是你如何修改它以处理成千上万条记录的批处理?
我找到了一个答案,建议将每个3个函数参数都变成数组。但是否有一种方法可以传递更接近于我的应用程序中记录的方式的参数呢?
例如,理想的解决方案是我的应用程序代码调用select foo($1)
,其中参数$1
是一个JSON对象数组,其中每个内部对象是要插入的记录。
[
{ "id": "1", "val1": "1-val1", "val2": "1-val2" },
{ "id": "2", "val1": "2-val1", "val2": "2-val2" },
{ "id": "3", "val1": "3-val1", "val2": "3-val2" },
{ "id": "4", "val1": "4-val1", "val2": "4-val2" }
]
第二个最好的选择是我的应用程序代码调用
select foo($1, $2, $3, $4)
,其中每个参数都是对应要插入的记录的JSON对象。{ "id": "1", "val1": "1-val1", "val2": "1-val2" } // This would be $1
{ "id": "2", "val1": "2-val1", "val2": "2-val2" } // This would be $2
我正在查看Postgres提供的各种JSON函数,这里有相关内容,但我无法确定应该使用哪个函数。我的目标是否可行?在任何地方使用JSON数组而不是JSON对象是否可以实现这一目标?