我正在尝试用单个命令进行大容量插入。它适用于像int/string这样的简单值,但在插入到jsonb
列时失败了。
我的表格示例:
CREATE TABLE data_table2 (id INTEGER NOT NULL, name TEXT NOT NULL, test jsonb, bar jsonb)
我的查询来自。NET(在没有@c
参数的情况下使用时效果非常好(:
"INSERT INTO data_table2 (id, name, test, bar) SELECT * FROM unnest(@a, @b, @c, @d)"
我正在创建这样的@a
参数:new NpgsqlParameter<int[]>(name, value)
,它导致逐行插入(就像我想要的那样(。现在,当我添加下一个@c
jsonb参数时,它失败了,并且我没有逐行插入,而是得到了一个错误42883: function pg_catalog.unnest(jsonb) does not exist
,这是一个谎言,因为我以前只能插入id/string。net中的第三个参数如下:
new NpgsqlParameter<string[]>(name, NpgsqlTypes.NpgsqlDbType.Jsonb) { Value = value.ToJson() }
而CCD_ 10方法正在做:
value.Select(x => Newtonsoft.Json.JsonConvert.SerializeObject(x, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })).ToArray()
我已尝试将查询更改为:
"INSERT INTO data_table2 (id, name, test) SELECT * FROM unnest(@a, @b, ARRAY[@c])"
它起作用了,但前两列被插入时没有问题,但第三列只插入了一行,其中包含了所有结果,其余行都为空。
有人能看看我缺了什么吗?
问题是您没有传入JSONB文档的数组,您必须将参数更改为
new NpgsqlParameter<string[]>(name, NpgsqlDbType.Jsonb | NpgsqlDbType.Array) { Value = value.ToJson() }`
// ^^^ this is `jsonb[]` type
如果它仍然导致相同的错误,请确保ToJson实际返回数组。
另一个选项是将JSON作为字符串数组发送,并在INSERT语句中进行转换:
INSERT INTO data_table2 (id, name, test, bar) SELECT a, b, c::jsonb, d::jsonb FROM unnest(@a, @b, @c, @d) foo(a, b, c, d)