我有一個包含TEXT等數組的複合類型。我在我的主表中使用這個來創建一個複合類型的數組。
如何生成INSERT命令(不使用複合類型的默認字段名稱)?我可以用組合數組創建一個TEMPORARY TABLE,然後將它插入到主表中嗎?PostgreSQL - 插入一個包含數組的複合類型數組
例如:
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);
所述第一插入失敗,並在消息:
ERROR: INSERT has more expressions than target columns.
失敗相同具有或不具有陣列[]構造。
我的現實世界的用法顯然更復雜,包含其他複合材料的複合材料以及許多領域。
由於性能方面的原因,我沒有使用多個表(不需要連接來檢索),內部組合和數組也不會獨立引用。
我使用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;
歡迎來到StackOverflow!在這一點上,它看起來不像使用Perl DBI,所以這真的是PostgreSQL的問題,對吧?如果您不使用[數組類型](http://www.postgresql.org/docs/current/static/arrays.html「看起來很有用!」),SQL是否工作? –
哦。當你說「它還沒有工作」時,你是否有錯誤信息?你能複製它並粘貼在問題中嗎? –
在學習複合類型之前,我已經完成了整個解決方案。但是做複合材料的INSERT,尤其是包含數組的composites數組讓我感到困惑。並且錯誤消息是:錯誤:INSERT具有比目標列更多的表達式 –