我刚刚发现的Postgres的一个真正整洁的功能是定义composite type
的能力-在他们的文档中也称为ROWS
和RECORDS
。考虑以下示例
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。考虑下面的示例...
您需要带有ARRAY
的方括号: