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[] 
); 

要结合这里两件事情,一个字段类型为复合型personarray

要插入一个复合型,你应该做这样的事情ROW("bob","blue","springfield",33),注意ROW关键字是可选的

对于数组类型,您应该使用括号单引号内,如'{val1,val2}',你的情况,你是唯一一个加入array的元素,其结果是person类型。

你的榜样应该是这样的:

INSERT INTO towns VALUES (0, '{ROW("bob","blue","springfield",33)}'); 

注意,双引号是为person类型内的值,而不是整个对象。

参考文献:Composite TypesArrays

要访问的人的值,你必须包裹object(),所以(person).name

+0

嘿,我很欣赏报价和单引号的神秘化!然而,我尝试执行给出的例子,提出错误“malformed array literal:”{ROW(“bob”,“blue”,“springfield”,33)}“'。我在阅读完更张贴的文档之后做了一些测试,只使用了一个只有复合类型实例的表格。使用你提到的用于插入复合类型的结构和包装字段以访问复合字段完美无缺! – Jdeggs

+0

请注意,数组应该用单引号括起来,而不是双引号 – phobia82

我能得到这个工作的唯一途径是通过下列方式插入:

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