2016-11-26 1 views
3

PostgreSQL을 배우려고 할 때 몇 가지 문제가있었습니다. person이라는 관계형 객체를 생성 한 다음 기본 정수 키와 person 객체 배열로 구성된 테이블을 생성했습니다. 그러나 나는이 배열에 행을 삽입하는 방법이라는 느낌이 들지만, 개체의 특정 열 (예 : person.name)에 액세스하는 방법을 잘 모르겠습니다.PostgreSQL은 사용자 정의 된 객체의 배열에 삽입하고 선택합니다.

현재 행을 삽입 할 수있는 유일한 방법은 다음과 같습니다. 그러나 적절한 사람 개체 대신 문자열 개체를 만들 수도 있습니다.

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

참고로 내가 만든 스키마는 다음과 같습니다 당신은 여기에 2 가지, 복합 형 personarray 같은 필드 유형을 결합하는

CREATE TYPE person AS (
    name text, 
    favorite_color text, 
    hometown text, 
    age integer 
); 

CREATE TABLE towns (
    town_id integer PRIMARY KEY, 
    people person[] 
); 

답변

0

.

, 당신이 ROW("bob","blue","springfield",33) 같은 것을해야한다 복합 형을 삽입 ROW 키워드가 당신의 경우, '{val1,val2}'처럼 작은 따옴표 안에 괄호를 사용한다 배열 유형의

, 당신은 하나의 추가 선택 사항입니다 점에 유의하십시오 요소가 array 인 경우 결과는 person 유형입니다. 따옴표가 아니라 전체 개체를 들어, person 유형 내부 값에 대한 것을

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

참고 :

귀하의 예처럼 보일 것입니다.

참고 : Composite Types,

Arrays이 사람의 값에 액세스하려면, 당신은 너무 (person).name

+0

견적과 견적의 신빙성에 감사드립니다!그러나 주어진 예제를 실행 해 보았습니다.'잘못된 배열 리터럴 : "{ROW ("bob ","blue ","springfield ", 33)}"이 발생했습니다. 복합 유형의 인스턴스가있는 테이블을 사용하여보다 철저하게 게시 한 문서를 읽은 후 몇 가지 테스트를 수행했습니다. 복합 유형에 삽입하고 복합 필드에 액세스하기 위해 필드를 배치하기 위해 언급 한 구조로 완벽하게 작동합니다! – Jdeggs

+0

배열은 작은 따옴표로 묶어야하며 이중으로 묶지 않아야합니다. – phobia82

0

나는 일이 얻을 수있는 유일한 방법은 다음과 같은 방법으로 삽입되었으며, object() 포장해야 :

INSERT INTO towns VALUES (0, (array[ROW('bob','blue','springfield',33)::person])); 

그리고 당신이해야 할 것입니다 선택 :

,369을
select (people[1]).age from towns; 
0

나는 '{...}'보다 array[...] 구문을 선호하는 이유 중 하나입니다. 당신은 중첩 따옴표에 대해 생각 할 필요가 없습니다 :

INSERT INTO towns (town_id, people) 
    VALUES 
(0, array[('bob','blue','springfield',33)::person]); 

('bob','blue','springfield',33)::person는 단일 요소 배열 것을 만드는 유형 personarray[...]의 기록을 작성합니다. 이 작업을하려면 사람에게 (...)으로 만든 익명 레코드를 캐스팅해야합니다. 어레이에 여러 사람이 레코드를 삽입 할 경우는 마지막에 전체 배열의 경우와 조금 덜 입력입니다 :

array[('bob','blue','springfield',33), ('arthur','red','sleepytown',42)]::person[] 

배열의 레코드의 특정 요소를 선택하려면, 당신은 예를 사용할 수 있습니다

select town_id, people[1].name 
from towns 
관련 문제