PostgreSQL插入并从用户定义的对象数组中选择
我一直在尝试学习PostgreSQL时遇到了一些问题。我创建了一个名为person的关系对象,然后是一个由主整数键和一个人物对象组成的表。我有一种感觉,就是我将行插入到数组中的方式,但是我不确定如何访问对象的特定列(例如person.name)。PostgreSQL插入并从用户定义的对象数组中选择
目前我能够插入一行的唯一方法如下但是,我认为它可能只是制作一个字符串对象而不是适当的人物对象。
INSERT INTO towns VALUES (0, '{"(bob,blue,springfield,33)"}');
仅供参考我创建的模式是:
CREATE TYPE person AS (
name text,
favorite_color text,
hometown text,
age integer
);
CREATE TABLE towns (
town_id integer PRIMARY KEY,
people person[]
);
要结合这里两件事情,一个字段类型为复合型person
的array
。
要插入一个复合型,你应该做这样的事情ROW("bob","blue","springfield",33)
,注意ROW
关键字是可选的
对于数组类型,您应该使用括号单引号内,如'{val1,val2}'
,你的情况,你是唯一一个加入array
的元素,其结果是person
类型。
你的榜样应该是这样的:
INSERT INTO towns VALUES (0, '{ROW("bob","blue","springfield",33)}');
注意,双引号是为person
类型内的值,而不是整个对象。
参考文献:Composite Types,Arrays
要访问的人的值,你必须包裹object
在()
,所以(person).name
我能得到这个工作的唯一途径是通过下列方式插入:
INSERT INTO towns VALUES (0, (array[ROW('bob','blue','springfield',33)::person]));
,并选择你将不得不这样做:
select (people[1]).age from towns;
这就是我比'{...}'
更喜欢array[...]
语法的原因之一。你不需要去想嵌套报价:
INSERT INTO towns (town_id, people)
VALUES
(0, array[('bob','blue','springfield',33)::person]);
('bob','blue','springfield',33)::person
创建person
类型和array[...]
的记录,使单个元素的数组。您必须将使用(...)
创建的匿名记录投射到个人才能完成此项工作。如果你想插入多个人员记录到数组这是一个有点少情况下,在结束整个数组类型:
array[('bob','blue','springfield',33), ('arthur','red','sleepytown',42)]::person[]
要在数组中选择一个记录的特定元素,可以使用例如:
select town_id, people[1].name
from towns
嘿,我很欣赏报价和单引号的神秘化!然而,我尝试执行给出的例子,提出错误“malformed array literal:”{ROW(“bob”,“blue”,“springfield”,33)}“'。我在阅读完更张贴的文档之后做了一些测试,只使用了一个只有复合类型实例的表格。使用你提到的用于插入复合类型的结构和包装字段以访问复合字段完美无缺! – Jdeggs
请注意,数组应该用单引号括起来,而不是双引号 – phobia82