PostgreSQL데이터베이스 디자이너에게 유용한 도구가 될 수있는 테이블 상속을 구현합니다. (SQL : 1999 년 및 나중에 여기에 설명 된 기능과 여러 측면에서 다른 유형 상속 기능을 정의합니다.)
예에서 시작하겠습니다. 도시를위한 데이터 모델을 구축하려고한다고 가정 해 봅시다. 각 주에는 많은 도시가 있지만 단 하나의 수도가 있습니다.캐피탈
테이블로라스 베이거스 |
:
테이블 도시 생성 (
이 경우캐피탈
테이블상속부모 테이블의 모든 열,도시
. 주 매디슨 |에는 추가 열이 있습니다.State
, 그것은 그들의 상태를 보여줍니다.
inpostgresql, 테이블은 0 이상의 다른 테이블에서 상속 될 수 있으며 쿼리는 테이블의 모든 행 또는 테이블의 모든 행과 모든 후손 테이블을 참조 할 수 있습니다. 후자의 동작은 기본값입니다.
높이, 고도를 선택하십시오
postgresql튜토리얼 (참조PostgreSQL : 문서 : 17 : 2.1. 사설 토토), 이것은 다음과 같습니다.
높이 | 높이
반면에 다음 쿼리는 주 매디슨 |가 아닌 500 피트 이상의 고도에 위치한 모든 라스 베이거스 |를 찾습니다.
높이, 고도를 선택하십시오
여기전용
키워드는 쿼리가에만 적용되어야 함을 나타냅니다.라스 베이거스 |
, 아래 테이블이 아님라스 베이거스 |
상속 계층에서. 우리가 이미 논의한 많은 명령 -select
,업데이트
및삭제
- 지원전용
키워드.
후행으로 테이블 높이을 쓸 수도 있습니다*
자손 테이블이 포함되어 있음을 명시 적으로 지정하려면
높이, 고도를 선택하십시오
쓰기*
이 동작은 항상 기본값이기 때문에 필요하지 않습니다. 그러나이 구문은 기본값이 변경 될 수있는 이전 릴리스와의 호환성을 위해 여전히 지원됩니다.
경우에 따라 특정 행이 시작된 테이블을 알고 싶을 매디슨 | 있습니다. 라는 시스템 열이 있습니다.Tableoid
원래 테이블을 알려주는 각 테이블에서 :
C.TableOid, C.Name, C.ELevation을 선택하십시오
반환 :
Tableoid | 높이 |
(이 예제를 재현하려고하면 다른 숫자 OID를 얻을 수 있습니다.)pg_class
실제 테이블 이름을 볼 수 있습니다 :
P.RelName, C.Name, C.Elevation을 선택하십시오
반환 :
Relname | 높이 |
같은 효과를 얻는 또 다른 방법은를 사용하는 것입니다.Regclass
alias 유형은 테이블 OID를 상징적으로 인쇄합니다 :
C.Tableoid :: Regclass, C.Name, C.Elevation을 선택하십시오
상속은 데이터를 자동으로 전파하지 않습니다삽입
또는copy
상속 계층의 다른 테이블에 대한 명령. 이 예에서 다음삽입
진술은 실패합니다 :
라스 베이거스 |에 삽입 (높이, 인구, 고도, 주)
우리는 데이터가 어떻게 든 라우팅되기를 바랍니다.캐피탈
테이블이지만 이것은 일어나지 않습니다 :삽입
항상 지정된 표를 정확히 삽입합니다. 경우에 따라 규칙을 사용하여 삽입을 리디렉션 할 수 있습니다 (참조토토 핫 : 문서 : 17 : 39 장). 그러나 위의 경우에는 도움이되지 않습니다.이기 때문입니다.라스 베이거스 |
테이블은 열이 포함되어 있지 않습니다State
, 규칙이 적용되기 전에 명령이 거부됩니다.
상위 테이블의 모든 점검 제약 및 Null 제약 조건은 자녀가 자동으로 상속됩니다.상속 없음
조항. 다른 유형의 제약 조건 (고유, 기본 키 및 외국 키 제약)이 상속되지 않습니다.
테이블은 하나 이상의 상위 테이블에서 상속 될 수 있으며,이 경우 부모 테이블에 의해 정의 된 열의 통합이 있습니다. Child Table의 정의에서 선언 된 모든 열이 추가됩니다.“병합”따라서 아동 테이블에 해당 열이 하나뿐입니다. 병합하려면 열에는 동일한 데이터 유형이 있어야합니다. 그렇지 않으면 오류가 발생합니다.
테이블 상속은 일반적으로 자식 테이블을 만들 때를 사용하여 설정됩니다.상속
조항테이블 생성
진술. 또는 호환 가능한 방식으로 이미 정의 된 테이블은를 사용하여 새로운 부모 관계가 추가 될 수 있습니다.상속
변형Alter Table
. 이를 위해 새 자식 테이블에는 이미 부모의 열과 동일한 높이과 유형의 열이 포함되어야합니다.상속 없음
변형Alter Table
. 상속 링크를 동적으로 추가하고 제거하면 상속 관계가 테이블 파티셔닝에 사용될 때 유용 할 수 있습니다 ( 참조토토 꽁 머니 PostgreSQL : 문서 : 17 : 5.12. 테이블 파티셔닝).
나중에 새로운 자녀가 될 호환성 테이블을 만드는 편리한 방법 중 하나는를 사용하는 것입니다.Like
조항테이블 생성
. 이것은 소스 테이블과 동일한 열의 새 테이블을 만듭니다.check
소스 테이블에 정의 된 제약 조건,제약 포함
옵션Like
새 자녀가 양 호환으로 간주되는 부모와 일치하는 제약이 있어야하므로 지정해야합니다.
어린이가 남아있는 동안 부모 테이블을 떨어 뜨릴 수 없습니다. 부모 테이블에서 상속 된 경우 하위 테이블의 열이나 제약 조건을 삭제하거나 변경할 수 없습니다.캐스케이드
옵션 (참조PostgreSQL : 문서 : 17 : 5.15. 무지개 토토성 추적).
Alter Table
열 데이터 정의의 변경 사항을 전파하고 상속 계층 구조의 제약 조건을 확인합니다. 다시 말하지만, 다른 테이블에 의존하는 열을 삭제하는 것은를 사용할 때만 가능합니다.캐스케이드
옵션.Alter Table
중복 열 병합 및 거부에 대한 동일한 규칙을 따릅니다.테이블 생성
.
상속 쿼리는 부모 테이블에서만 액세스 권한 점검을 수행합니다. 예를 들어, 부여업데이트
허가라스 베이거스 |
테이블은에서 행을 업데이트 할 수있는 권한을 의미합니다.캐피탈
테이블도 액세스 할 때라스 베이거스 |
. 이것은 데이터가 부모 테이블에있는 모양을 보존합니다.캐피탈
추가 보조금 없이는 테이블을 직접 업데이트 할 수 없습니다. 비슷한 방식으로 부모 테이블의 행 보안 정책 (참조섹션 5.9)는 상속 쿼리 중에 자식 테이블에서 오는 행에 적용됩니다. 아동 테이블의 정책은 쿼리에 명시 적으로 명명 된 테이블 일 때만 적용됩니다.
외국 테이블 (참조PostgreSQL : 문서 : 17 : 5.13. 외국 배트맨 토토)는 일반 테이블이 될 수있는 것처럼 상속 계층의 일부가 될 수 있습니다. 외국 테이블이 상속 계층의 일부인 경우 해외 테이블에서 지원하지 않는 작업은 전체 계층에서도 지원되지 않습니다.
모든 SQL 명령이 상속 계층에서 작업 할 수있는 것은 아닙니다. 데이터 쿼리, 데이터 수정 또는 스키마 수정에 사용되는 명령 (예 :select
,업데이트
,삭제
, 대부분의 변형Alter Table
하지만삽입
또는Alter Table ... Rename
) 일반적으로 자식 테이블을 포함하고 지원하는 기본값전용
그것들을 제외하기위한 표기법. 데이터베이스 유지 관리 및 튜닝을 수행하는 명령 (예 :Reindex
,진공
) 일반적으로 개별 물리적 테이블에서만 작동하며 상속 계층에 대한 재귀를 지원하지 않습니다. 각 개별 명령의 각 행동은 참조 페이지 (에 문서화되어 있습니다.토토 커뮤니티 postgresql : 문서 : 17 : SQL 명령).
상속 기능의 심각한 제한은 인덱스 (고유 한 제약 조건 포함)와 외국 주요 제약 조건이 상속 자녀가 아닌 단일 테이블에만 적용된다는 것입니다. 이것은 외국의 주요 제약 조건의 참조 및 참조 측면 모두에서 사실입니다.
우리가 선언 한 경우라스 베이거스 |
.높이
고유 한
또는 A기본 키
캐피탈
높이을 가진 행이있는 행이있는 테이블에서 행을 복제하는 행라스 베이거스 |
. 그리고이 중복 행은 기본적으로 쿼리로 표시됩니다.도시
. 사실, 기본적으로캐피탈
전혀 고유 한 제약 조건이 없으므로 같은 높이의 여러 행을 포함 할 수 있습니다. 당신은에 독특한 제약을 추가 할 수 있습니다캐피탈
, 그러나 이것은에 비해 복제를 방해하지 않습니다.라스 베이거스 |
.
마찬가지로, 우리가 그것을 명시해야한다면라스 베이거스 |
.높이
참조
다른 테이블,이 제약 조건은 자동으로 전파되지 않습니다캐피탈
. 이 경우 수동으로 동일하게 추가하여 작업 할 수 있습니다참조
제약 조건캐피탈
.
다른 테이블의 열 지정참조 라스 베이거스 | (높이)
다른 테이블에는 자본 높이이 아닌 도시 높이을 포함 할 수 있습니다. 이 경우에는 좋은 해결 방법이 없습니다.
상속 계층에 대해 구현되지 않은 일부 기능은 선언 파티셔닝을 위해 구현됩니다. 레거시 상속과의 분할이 응용 프로그램에 유용한 지 여부를 결정하는 데 상당한주의가 필요합니다.
문서에 정확하지 않은 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면