我将Npgsql中的值数组传递给一次插入多行的函数,并返回自动分配的序列ID。以下是我在服务器端工作的代码:
CREATE TABLE "MyTable" (
"ID" SERIAL PRIMARY KEY,
"Value" DOUBLE PRECISION NOT NULL
);
CREATE TYPE "MyTableType" AS (
"Value" DOUBLE PRECISION
);
CREATE FUNCTION "InsertIntoMyTable"(entries "MyTableType"[])
RETURNS SETOF INT AS $$
DECLARE
insertCmd TEXT := 'INSERT INTO "MyTable" ("Value") '
'VALUES ($1) RETURNING "ID"';
entry "MyTableType";
BEGIN
FOREACH entry IN ARRAY entries LOOP
RETURN QUERY EXECUTE insertCmd USING entry."Value";
END LOOP;
END;
$$ LANGUAGE PLPGSQL;
我的问题是,有没有办法将每个数组值作为一行插入而不循环遍历数组?例如,是否有一些Postgres语法可以实现以下实现:
CREATE FUNCTION "InsertIntoMyTable"(entries "MyTableType"[])
RETURNS SETOF INT AS $$
BEGIN
INSERT INTO "MyTable" ("Value")
SELECT "Value" FROM entries
RETURNING "ID";
END;
$$ LANGUAGE SQL;
目标是尽可能快地执行这些插入,因为这是我的生产系统最常完成的任务。
答案 0 :(得分:2)
您可以使用unnest()
函数将数组转换为集合:
INSERT INTO "MyTable" ("Value")
SELECT i
from unnest(entries) i;