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;