Postgres插入一个没有循环的数组
Postgres Insert An Array without a Loop
我将一组值从 Npgsql 传递给一次插入多行的函数,以及 returns 自动分配的序列号。以下是我在服务器端工作的代码:
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 () 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;
目标是尽可能快地执行这些插入,因为这是我的生产系统完成的最频繁的任务。
可以使用unnest()
函数将数组转换为集合:
INSERT INTO "MyTable" ("Value")
SELECT i
from unnest(entries) i;
我将一组值从 Npgsql 传递给一次插入多行的函数,以及 returns 自动分配的序列号。以下是我在服务器端工作的代码:
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 () 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;
目标是尽可能快地执行这些插入,因为这是我的生产系统完成的最频繁的任务。
可以使用unnest()
函数将数组转换为集合:
INSERT INTO "MyTable" ("Value")
SELECT i
from unnest(entries) i;