PostgreSQL - FÜGEN Sie ein Array vom zusammengesetzten Typ ein, das Arrays enthält

Ich habe einen zusammengesetzten Typ, der TEXT-Arrays usw. enthält. Ich verwende diesen in meiner Haupttabelle, um ein Array vom zusammengesetzten Typ zu erstellen.
Wie erstelle ich einen INSERT-Befehl (ohne die Standardfeldnamen des zusammengesetzten Typs zu verwenden)? Kann ich eine TEMPORARY TABLE mit dem Array von Composites erstellen und diese dann in die Haupttabelle einfügen?

Zum Beispiel:

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 ); 

Das erste INSERT schlägt mit der Meldung fehl:

FEHLER: INSERT enthält mehr Ausdrücke als Zielspalten.

Schlägt mit oder ohne array [] -Konstrukt fehl.

Mein Einsatz in der Praxis ist wesentlich komplexer, da das Composite andere Composites und viele verschiedene Bereiche enthält.

Ich verwende hier aus Leistungsgründen nicht mehrere Tabellen (zum Abrufen ist kein Join erforderlich), und auf die inneren Composites und Arrays wird niemals unabhängig voneinander verwiesen.

ich benutzeperl(5.14.2) undDBI(1.616) undpsql(9.1.7).

MEHR INFO:

Das Folgende funktioniert, aber wie ändere ich es, damit ich nicht ALLE Buchfelder angeben muss:

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;

Antworten auf die Frage(1)

Ihre Antwort auf die Frage