【发布时间】:2017-05-20 11:50:08
【问题描述】:
这是一个用于 postgres 9.6 的 plpgsql 函数。它尝试INSERT 一行,如果插入没有失败(由于违反键约束),那么它会运行更多命令。
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
$$
这个函数只处理一条记录,但是如何修改它来处理成批的数千条记录呢?
我找到了answer,它建议将 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 here 提供的各种 JSON 函数,它们似乎与此相关,但我不知道究竟要使用哪个。我想要做的甚至可能吗?是否可以在任何地方使用 JSON 数组 而不是 JSON 对象 来实现这一点?
【问题讨论】:
-
是的,现在试了一下,效果很好,谢谢!
标签: sql json postgresql plpgsql sql-insert