【发布时间】:2013-01-08 22:48:35
【问题描述】:
我有一个包含 TEXT 数组等的复合类型。我在我的主表中使用它来创建一个复合类型的数组。
如何生成 INSERT 命令(不使用复合类型的默认字段名称)?我可以使用复合数组创建一个 TEMPORARY TABLE,然后将其插入到主表中吗?
例如:
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;
【问题讨论】:
-
欢迎来到 StackOverflow!在这一点上,您似乎还没有达到使用 Perl DBI 的地步,所以这确实是一个 PostgreSQL 问题,对吧?如果您不使用array types,SQL 是否有效?
-
哦。当您说“它还不起作用”时,您是否有错误消息?你可以复制它并粘贴到问题中吗?
-
在我了解复合类型之前,我已经完成了整个解决方案。但是做复合材料的插入,特别是包含数组的堆肥数组让我感到困惑。错误信息是:ERROR: INSERT has more expressions than target columns
-
如果我删除 array[] 构造,仍然会失败并显示相同的错误消息。
-
现在有一个工作示例,但仍有一个问题:我该如何解决它,所以我不需要指定 book 的所有字段,因为我的真实代码在复合中有很多字段.
标签: sql perl postgresql postgresql-9.1 dbi