Postgresql 从复合类型数组和一个附加列中多插入

Posted

技术标签:

【中文标题】Postgresql 从复合类型数组和一个附加列中多插入【英文标题】:Postgresql multi insert from array of composite type and one additional column 【发布时间】:2021-03-22 16:10:50 【问题描述】:

我有什么:

CREATE TYPE Item AS (
    a bigint,
    b bigint
);

CREATE TABLE items (
    id bigint NOT NULL,
    a bigint NOT NULL,
    b bigint NOT NULL
);

CREATE OR REPLACE FUNCTION items_insert(
        _id bigint,
        _items Item[]
) RETURNS void AS
...

如何通过一个多插入查询将多个 columns 行插入到 _items 中具有相同 _id 的表项?

我正在使用 Postgresql-9.2

【问题讨论】:

与您的问题无关,但是:Postgres 9.2 是no longer supported,您应该尽快计划升级。 【参考方案1】:

我认为您的意思是“插入多个”而不是列。

假设这是正确的,我认为您正在寻找这样的功能:

create or replace function items_insert(_id bigint, _items item[]) 
  returns void 
as
$$
  insert into items (id, a, b)
  select _id, it.*
  from unnest(_items) as it(a,b);
$$
language sql;

Online example

【讨论】:

感谢您的提前。我找到了更短的方法:INSERT INTO items(id, a, b) SELECT _id, (unnest(_items)).*; @КонстантинПрименко:不建议在 SELECT 列表中使用 unnest()。最好在FROM子句中使用 为什么不推荐在SELECT列表中使用unnest()

以上是关于Postgresql 从复合类型数组和一个附加列中多插入的主要内容,如果未能解决你的问题,请参考以下文章

复合数组类型作为 PostgreSQL 中的 OUTPUT 参数

SQL查询从postgresql数据库表中具有数组数据类型的列中获取数据。

插入复合类型数组给出错误 postgresql 9.4--

对PostgreSQL中数组类型列中的每个元素应用除法

从函数返回时复合数据类型缺失值

如何从 postgresql 9.4 中的数组列中选择前几位