Postgresql多插入数组变量

Postgresql multi Insert with array variable

我想用变量 array/list 进行多重动态插入。插入的数量将始终变化。

我想更换

insert into my table (col 1, col 2)
select *
from unnest(array[1, 2], array[3, 4]);

insert into my table (col 1, col 2)
select *
from unnest(:list-of-inserts);

取决于你是否想用你的数据创建一个新的Table?

这可能很简单:

SELECT * INTO table FROM unnest(array[1, 2], array[3, 4]);

临时做同样的事情 table :

SELECT * INTO temp mytable FROM unnest(array[1, 2], array[3, 4]);

然后

INSERT INTO table (col 1, col 2) SELECT col1, col2 FROM mytable;

希望这能回答您的问题。

我将它包装在一个函数中...然后这将很好地翻译成任何具有 PostgreSQL 数据适配器的编程语言,几乎所有这些都是。作为额外的好处,它在 psql 中也能很好地工作。

CREATE OR REPLACE FUNCTION ez_insert(list1 integer[], list2 integer[])
  RETURNS integer AS
$BODY$
DECLARE
  rowcount integer;
BEGIN

  insert into my_table (col_1, col_2)
  values
  (unnest (list1), unnest (list2));

  GET DIAGNOSTICS rowcount = ROW_COUNT;
  return rowcount;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

正在调用:

select ez_insert (array[1, 2, 3], array[7, 8, 9])

警告 -- 如果您的数组大小不同,请注意会出现奇怪的情况。

这是一个用 C# 实现的简单示例:

NpgsqlCommand cmd = new NpgsqlCommand("select ez_insert(:ARRAY1, :ARRAY2)", conn);
cmd.Parameters.Add(new NpgsqlParameter("ARRAY1",
    NpgsqlDbType.Array | NpgsqlDbType.Integer));
cmd.Parameters.Add(new NpgsqlParameter("ARRAY2",
    NpgsqlDbType.Array | NpgsqlDbType.Integer));
cmd.Parameters[0].Value = ar1;
cmd.Parameters[1].Value = ar2;

int inserts = (int)cmd.ExecuteScalar();