簡體   English   中英

PostgreSQL - INSERT包含數組的復合類型數組

[英]PostgreSQL - INSERT an array of composite type containing arrays

我有一個包含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;

PostgreSQL數組是有用的抽象(非標准,我應該添加),它可以很容易被濫用 - 我認為這正是你想要做的。

您正在嘗試使用數組作為不規范化數據庫模式的借口和快捷方式。 它可能適用於一些kludges,但從長遠來看這是不值得的。

如果繼續使用數組,您將無法利用許多真正使SQL有用的結構。 例如,您無法有效地在book_set表中搜索任何給定的作者。

正確的設計是規范化 - book_set不應該包含作者數組。 而是創建單獨的表authors和單獨的鏈接表book_author

當然,使用規范化方法,插入數據會更加笨拙,而查詢數據會更加尷尬 - 您需要執行連接。

但是,它可以創建幾乎任何可以想象的查詢。 此外,通過適當的索引,即使您的數據集非常大,它也可以非常快速地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM