【发布时间】:2015-04-17 01:28:14
【问题描述】:
我将 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;
我们的目标是尽可能快地执行这些插入,因为这是我的生产系统最常完成的任务。
【问题讨论】:
-
不相关,但是:你真的应该避免引用标识符。从长远来看,它们带来的麻烦远多于它们的价值。