当前位置: 首页 > 面试题库 >

PostgreSQL-插入包含数组的复合类型数组

乜胜泫
2023-03-14
问题内容

我有一个包含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)

更多信息:

下面的作品,但是我如何更改它,这样我就不必指定book的所有字段:

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;

问题答案:

PostgreSQL数组是有用的抽象(非标准,我应该添加),有点容易被滥用-我认为这正是您要尝试的方法。

您正在尝试使用数组作为不规范数据库架构的借口和捷径。它可能适用于某些问题,但从长远来看,这是不值得的。

如果继续使用数组,将无法利用许多确实使SQL有用的构造。例如,您不能有效地在book_set表中搜索任何给定的作者。

正确的设计将是规范化的-book_set不应包含大量作者。而是创建单独的表authors和单独的链接表book_author

当然,使用规范化方法插入数据更麻烦,查询数据也更麻烦-您将需要执行联接。

但是,这使得创建几乎所有可以想象的查询成为可能。同样,通过适当的索引编制,即使您的数据集非常大,它也可以非常快速地工作。



 类似资料:
  • 我试图在放置在PostgreSQL数据库中的JSON数组中找到特定值。我搜索了一些解决方案(在搜索smth时访问了所有链接,如“在json数组postgresql中查找值”),并尝试了它们,但没有成功,下面是我的最后一个工作示例: 这个解决方案只是打印出我的JSON列。我理解和的工作流程,但是对我来说很神奇。也许是原因? 我拥有的JSON结构: 因此,我需要了解如何提取值并找到我需要的值。提前谢谢

  • 问题内容: 我找不到用Clojure插入Postgres数组类型的方法。 没按我预期的那样工作。错误信息: 即使是我能找到的对SQL的最直接访问也不起作用: 真的不知道这是怎么回事: 当然一定有可能吗?如果不是通过辅助函数,则通过某种方式执行原始SQL。 问题答案: 使用 插入! 要插入字符串向量,您必须(从字符串向量中)创建一个实现java.sql.Array的对象。您可以使用java.sql.

  • 问题内容: 我希望能够将bigints数组写入要用于Go历史记录的表中。不幸的是,我不能,当我这样做时`sql: converting Exec argument 这是我要插入的表的结构: 问题答案: 使用自定义类型实现database / sql / driver.Valuer:

  • 问题内容: 我的任务是用Java编写哈希表,该哈希表必须适用于任何数据类型。我正在编写的代码规则如下:-哈希表必须具有一个数组作为基础数据结构,其大小在构造对象时确定- 发生冲突时,应该放置碰撞的元素链接列表,该列表包含哈希表中该索引(键)处的所有元素 因此,对于基础数据类型,我做了一个LinkedList类型的数组(自定义,不是Java API LinkedList)。 当然,问题是实例化此数组

  • 问题内容: 很抱歉,如果这是重复的,尽管我无法在任何地方找到确切的答案: 有没有办法在 postgreSQL中 创建一个包含多个数据类型的数组? 我有一个类型的列(类型文本数组);尽管我想从type插入三个条目,然后插入第四个条目到此数组中。 有办法吗?如果是这样,怎么办? 问题答案: 我不认为有一种方法可以声明具有多个类型的数组。但是,我认为您可以使用复合类型来完成您想做的事情,例如, 然后,您

  • 我有一个mapper方法,定义如下 相应的SQLBuilder方法定义为 每当我调用我的mappermethod时,如下所示 我遇到了以下错误。 错误可能涉及ActivityMapper。insertIntoActivityComment Inline设置参数时出错\n####SQL:insert into activityComment(commenttype、commenttext、comme