Мультиинсталляция Postgresql из массива составного типа и одного дополнительного столбца

#postgresql #sql-insert #postgresql-9.2

Вопрос:

Что у меня есть:

 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
...
 

Как я могу вставить строки с несколькими столбцами в элементы таблицы с одинаковым _id из _items с помощью ОДНОГО запроса с несколькими вставками?

Я использую Postgresql-9.2

Комментарии:

1. Не имеет отношения к вашей проблеме, но: Postgres 9.2 больше не поддерживается , вам следует запланировать обновление как можно скорее.

Ответ №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;
 

Онлайн-пример

Комментарии:

1. Спасибо за заранее. Я нашел более короткий путь: INSERT INTO items(id, a, b) SELECT _id, (unnest(_items)).*;

2. @КонстантинПрименко: использование unnest() в списке выбора не рекомендуется. Лучше использовать его в предложении FROM

3. Почему использование unnest() в SELECT списке не рекомендуется?