PostgreSQL - ВСТАВИТЬ массив составного типа, содержащий массивы

У меня есть составной тип, содержащий массивы TEXT и т. Д. Я использую это внутри моей основной таблицы для создания массива составного типа.

Как сгенерировать команду INSERT (без использования имен полей по умолчанию составного типа)? Могу ли я создать ВРЕМЕННЫЙ СТОЛ с массивом композитов и затем вставить его в основную таблицу?

Например:

DROP TABLE collection;
DROP TABLE book_set;
DROP TYPE book;

CREATE TYPE book AS ( title TEXT, authors TEXT[], extra_spare TEXT );
CREATE TEMPORARY TABLE book_set ( books book[] );
CREATE TABLE shelf_collection ( shelf INT, position INT, books book[] );

-- Prefer to specify the fields I want, and NOT extra_spare as shown here!
-- AND it doesn't yet work... needs more casting?
INSERT INTO book_set( books ) VALUES (
      ( 'book1', array[ ( 'author1', 'author2' ) ], '' ),
      ( 'book2', array[ ( 'author3' )            ], '' ) ); 

-- And this obviously does not work yet!
INSERT INTO shelf_collection( shelf, position, books ) VALUES ( 1, 2, book_set ); 

Первый INSERT завершается с сообщением:

ОШИБКА: INSERT имеет больше выражений, чем целевых столбцов.

Сбой то же самое с или без конструкции array [].

Мое реальное использование значительно сложнее, с композитом, содержащим другие композиты и множество полей.

Я не использую здесь несколько таблиц по соображениям производительности (для извлечения не требуется объединение), и на внутренние композиты и массивы никогда не ссылаются независимо.

я используюperl(5.14.2) а такжеDBI(1.616) а также .psql(9.1.7)

БОЛЬШЕ ИНФОРМАЦИИ:

Следующее работает, но как мне его изменить, чтобы мне не нужно было указывать ВСЕ поля книги:

DROP TABLE shelf_collection;
DROP TYPE book;

CREATE TYPE  book AS          ( title TEXT, authors TEXT[], extra_spare TEXT );
CREATE TABLE shelf_collection ( shelf INT, position INT, books book[] );

INSERT INTO shelf_collection VALUES ( 12, 23, array[ROW( 'book title 1', array[ 'author1', 'author2' ], '' )::book] );

SELECT * FROM shelf_collection;

Ответы на вопрос(1)

Ваш ответ на вопрос