Postgres-具有复合类型数组的CRUD操作

问题描述 投票:0回答:1

我刚刚发现的Postgres的一个真正整洁的功能是定义composite type的能力-在他们的文档中也称为ROWSRECORDS。考虑以下示例

CREATE TYPE dow_id AS
(
 tslot smallint,
 day smallint
);

现在考虑下表

CREATE SEQUENCE test_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1;

CREATE TABLE test_simple_array 
(
 id integer DEFAULT nextval('test_id_seq') NOT NULL,
 dx  integer []
);

CREATE TABLE test_composite_simple 
(
 id integer DEFAULT nextval('test_id_seq') NOT NULL,
 dx  dow_id
);

CREATE TABLE test_composite_array 
(
 id integer DEFAULT nextval('test_id_seq') NOT NULL,
 dx  dow_id[]
);

前两个表的CRUD操作相对简单。例如

INSERT INTO test_simple_array (dx) VALUES ('{1,1}');
INSERT INTO test_composite_simple (dx) VALUES (ROW(1,1));

但是,当表具有array of records/composite types中的test_composite_array时,我无法弄清楚如何执行CRUD ops。我已经尝试过

INSERT INTO test_composite_array (dx) VALUES(ARRAY(ROW(1,1),ROW(1,2)));

失败并显示消息

错误:“ ROW”处或附近的语法错误

INSERT INTO test_composite_array (dx) VALUES("{(1,1),(1,2)}");

失败并显示消息

错误:列“ {{,1 ,,(1,2)}”不存在]

INSERT INTO test_composite_array (dx) VALUES('{"(1,1)","(1,2)"}');

尽管似乎有效,但自从以后以来我一直感到困惑

从test_composite_array选择dx

返回一个字符串结果{"(1,1),(1,2)},尽管进一步查询,例如

SELECT id FROM test_composite_array WHERE (dx[1]).tslot = 1;

作品。我也尝试了以下

SELECT (dx[1]).day FROM test_composite_array;
UPDATE test_composite_array SET dx[1].day = 99 WHERE (dx[1]).tslot = 1;
SELECT (dx[1]).day FROM test_composite_array;

在]时有效>

 UPDATE test_composite_array SET (dx[1]).day = 99 WHERE (dx[1]).tslot = 1;

失败。我发现我正在弄清楚如何通过反复试验来操作Postgres中的记录/复合类型的数组,并且-尽管Postgres文档通常非常出色-在文档中似乎没有对该主题的明确讨论。任何人都可以指出我对如何在Postgres中操作复合类型数组的权威性讨论。

此外,使用此类阵列时是否有意外的陷阱?

我刚刚发现的Postgres的一个真正整洁的功能是能够定义复合类型-在他们的文档中也称为ROWS和RECORDS。考虑下面的示例...

arrays postgresql record composite
1个回答
0
投票

您需要带有ARRAY的方括号:

© www.soinside.com 2019 - 2024. All rights reserved.