두 개의 테이블을 만들어 봅시다. 수도 테이블에는 상태가 포함되어 있습니다 도시 인 수도. 당연히 수도 테이블 도시에서 물려 받아야합니다.
테이블 도시 생성 ( 이름 텍스트, 모집단 플로트, 고도 int- (FT) ); 테이블 캐피탈 생성 ( 상태 문자 (2) ) 상속 (도시);
이 경우 캐피탈 행상속모든 속성 (이름, 모집단 및 고도) 부모, 도시로부터. 주 대문자에는 추가가 있습니다 그들의 상태를 보여주는 속성, 상태. 안에젠 토토, 테이블은 0에서 상속 될 수 있습니다 더 많은 다른 테이블과 쿼리는 모든 행의 모든 행을 참조 할 수 있습니다. 테이블 또는 테이블의 모든 행과 모든 후손들.
참고 :상속 계층은 실제로 a입니다 지시 된 acyclic 그래프.
예를 들어 다음 쿼리는 모든 이름을 찾습니다. 고도에 위치한 주 수도를 포함한 도시 500 피트 이상 :
이름, 고도를 선택하십시오 도시에서 고도 500;
반환 :
이름 | 고도 -----------+--------- 라스 베이거스 | 2174 마리포사 | 1953 매디슨 | 845
반면에 다음 쿼리는 모든 도시를 찾습니다. 주 수도가 아니며 고도에 위치하고 있습니다. 500ft :
이름, 고도를 선택하십시오 도시에서만 여기서 고도 500; 이름 | 고도 -----------+--------- 라스 베이거스 | 2174 마리포사 | 1953
여기"만"도시 전 쿼리는 도시에서만 실행되어야하며 상속 계층 구조의 도시 아래 표. 많은 우리가 이미 논의한 명령 -select, 업데이트and삭제- this 지원"만"표기법.
감가 상각 :이전 버전의젠 토토, 기본 동작은 그렇지 않았습니다 쿼리에 자식 테이블을 포함합니다. 이것은 것으로 밝혀졌습니다 오류가 발생하기 쉬우 며 SQL을 위반 중입니다 : 1999 기준. 이전 구문 하에서 하위 테이블을 얻으려면 부록*테이블 이름으로. 을 위한 예
선택 *에서 도시에서 *;여전히 하위 테이블을 명시 적으로 지정할 수 있습니다 첨부*및 명시 적으로 작성하여 자식 테이블을 스캔하지 않음"만". 그러나 버전 7.1에서 시작하여 미개화 된 테이블 이름의 기본 동작은 스캔하는 것입니다. 기본값 이전에는 하위 테이블도 없지만 그래서. 이전 기본 동작을 얻으려면 구성을 설정하십시오 옵션SQL_INHERITANCE꺼짐, 예 :
sql_inheritance를 OFF로 설정하십시오;또는 당신의 줄을 추가하십시오젠 토토.conf파일.
경우에 따라 특정 테이블을 알고 싶을 수도 있습니다. 행이 시작되었습니다. 라는 시스템 열이 있습니다.Tableoid각 테이블에서 원래 테이블 :
C.Tableoid, C.Name, C.Altitude를 선택하십시오 도시에서 c 여기서 c.altitude 500;
반환 :
Tableoid | 이름 | 고도 ----------+----------+---------- 139793 | 라스 베이거스 | 2174 139793 | 마리포사 | 1953 139798 | 매디슨 | 845
(이 예를 재현하려고하면 아마 다른 숫자 Oids.)와 함께PG_CLASS실제 테이블을 볼 수 있습니다 이름 :
P.RelName, C.Name, C.Altitude를 선택하십시오 도시 C, pg_class p 여기서 c.altitude 500 및 c.tableoid = p.oid;
반환 :
Relname | 이름 | 고도 ----------+----------+---------- 도시 | 라스 베이거스 | 2174 도시 | 마리포사 | 1953 수도 | 매디슨 | 845
테이블은 하나 이상의 상위 테이블에서 상속 될 수 있습니다. 사례는 부모 테이블에 의해 정의 된 열의 통합을 가지고 있습니다. (또한 아동 테이블에 대해 특별히 선언 된 모든 열).
상속 기능의 심각한 제한은 그 것입니다 인덱스 (고유 한 제약 포함) 및 외국 키 제약은 상속이 아닌 단일 테이블에만 적용됩니다. 어린이들. 이것은 참조와 참조 모두에서 사실입니다 외국 키 제약 조건의 측면. 따라서,의 관점에서 위의 예 :
우리가 선언 한 경우도시.이름to BE고유 한또는 A기본 키, 이것은 멈추지 않을 것입니다캐피탈행이있는 테이블 이름을 복제하는 행으로도시. 그리고 그 중복 행은 기본값은 쿼리에 나타납니다.도시. 사실, 기본적으로캐피탈고유 한 제약 조건이 없습니다 모두 같은 이름의 여러 행을 포함 할 수 있습니다. 당신은에 독특한 제약을 추가 할 수 있습니다캐피탈, 그러나 이것은 막지 않습니다 에 비해 복제도시.
마찬가지로, 우리가 그것을 지정하려면도시.이름 참조다른 테이블, 이것 제약 조건은 자동으로 전파되지 않습니다캐피탈. 이 경우 작업 할 수 있습니다 수동으로 동일한 것을 추가하여 주변참조제약 조건캐피탈.
다른 테이블의 열 지정참조 도시 (이름)다른 사람을 허용합니다 도시 이름을 포함하는 테이블이지만 자본 이름은 아닙니다. 거기 있습니다 이 경우에 대한 좋은 해결 방법이 없습니다.
이러한 결함은 아마도 미래에 고정 될 것입니다 릴리스이지만 그 동안 상당한 치료가 필요합니다. 상속이 문제에 유용한 지 결정합니다.