Postgres插入一个没有循环的数组

时间:2015-04-16 17:25:50

标签: postgresql postgresql-9.3

我将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;

目标是尽可能快地执行这些插入,因为这是我的生产系统最常完成的任务。

1 个答案:

答案 0 :(得分:2)

您可以使用unnest()函数将数组转换为集合:

INSERT INTO "MyTable" ("Value")
SELECT i
from unnest(entries) i;