【问题标题】:Postgres Insert An Array without a LoopPostgres 插入一个没有循环的数组
【发布时间】: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;

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

【问题讨论】:

  • 不相关,但是:你真的应该避免引用标识符。从长远来看,它们带来的麻烦远多于它们的价值。

标签: postgresql postgresql-9.3


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多