我在尝试学习PostgreSQL时遇到了一些问题。我创建了一个名为person的关系对象,然后创建了一个由主整数键和一个person对象组成的表。我感觉这是我在这个数组中插入行的方式,但我不确定如何访问该对象的特定列(例如,person.name)。
目前我能够插入行的唯一方法如下,但我认为它可能只是制作一个字符串对象而不是正确的人物对象。
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[]
);
答案 0 :(得分:0)
您在这里组合了两件事,一个字段类型为array
的复合类型person
。
要插入复合类型,您应该执行类似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
答案 1 :(得分:0)
我能让这个工作的唯一方法是通过以下方式插入:
INSERT INTO towns VALUES (0, (array[ROW('bob','blue','springfield',33)::person]));
要选择你必须这样做:
select (people[1]).age from towns;
答案 2 :(得分:0)
这是我更喜欢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