PostgreSQL데이터베이스 디자이너에게 유용한 도구가 될 수있는 테이블 상속을 구현합니다. (SQL : 1999 년 및 나중에 여기에 설명 된 기능과 여러 측면에서 다른 유형 상속 기능을 정의합니다.)
예에서 시작하겠습니다. 라스 베이거스 |를위한 데이터 모델을 구축하려고한다고 가정 해 봅시다. 각 주에는 많은 라스 베이거스 |가 있지만 단 하나의 매디슨 |가 있습니다.캐피탈
테이블이 상속되어도시
:
테이블 라스 베이거스 | 생성 (
이 경우캐피탈
테이블상속부모 테이블의 모든 열,도시
. 주 수도에는 추가 열이 있습니다.State
, 그것은 그들의 상태를 보여줍니다.
inPostgreSQL, 테이블은 0 이상의 다른 테이블에서 상속 될 수 있으며 쿼리는 테이블의 모든 행 또는 테이블의 모든 행과 모든 후손 테이블을 참조 할 수 있습니다. 후자의 동작은 기본값입니다.
이름, 고도를 선택하십시오
PostgreSQL튜토리얼 (참조토토 : 문서 : 12 : 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
상속 계층의 다른 테이블에 명령. 이 예에서 다음삽입
성명서 실패 :
도시에 삽입 (이름, 인구, 고도, 주)
우리는 데이터가 어떻게 든 라우팅되기를 바랍니다.캐피탈
테이블이지만 이것은 일어나지 않습니다 :삽입
항상 지정된 테이블에 항상 삽입됩니다. 경우에 따라 규칙을 사용하여 삽입을 리디렉션 할 수 있습니다 (참조PostgreSQL : 문서 : 12 : 40 장. 토토 사이트 시스템). 그러나 위의 경우에는 도움이되지 않습니다.이기 때문입니다.도시
테이블은 열이 포함되어 있지 않습니다State
, 따라서 규칙이 적용되기 전에 명령이 거부됩니다.
부모 테이블의 모든 점검 제약 및 널없는 제약 조건은 자녀가 자동으로 상속됩니다.상속 없음
조항. 다른 유형의 제약 조건 (고유, 기본 키 및 외국 키 제약)이 상속되지 않습니다.
테이블은 하나 이상의 상위 테이블에서 상속 될 수 있으며,이 경우 부모 테이블에 의해 정의 된 열의 통합이 있습니다. Child Table의 정의에서 선언 된 모든 열이 추가됩니다.“병합”따라서 아동 테이블에 해당 열이 하나뿐입니다. 병합하려면 열에는 동일한 데이터 유형이 있어야합니다. 그렇지 않으면 오류가 발생합니다.
테이블 상속은 일반적으로 자식 테이블을 만들 때를 사용하여 설정됩니다.상속
조항테이블 만들기진술. 또는 호환 가능한 방식으로 이미 정의 된 테이블은를 사용하여 새로운 부모 관계가 추가 될 수 있습니다.상속
변형Alter Table. 이를 위해 새 자식 테이블에는 이미 부모의 열과 동일한 높이과 유형의 열이 포함되어야합니다.상속 없음
변형Alter Table
. 상속 링크를 동적으로 추가하고 제거하면 상속 관계가 테이블 파티셔닝에 사용될 때 유용 할 수 있습니다 ( 참조스포츠 토토 PostgreSQL : 문서 : 12 : 5.11. 테이블 파티셔닝).
나중에 새로운 자녀가 될 호환성 테이블을 만드는 편리한 방법은를 사용하는 것입니다.좋아요
조항테이블 만들기
. 이것은 소스 테이블과 동일한 열의 새 테이블을 만듭니다.check
소스 테이블에 정의 된 제약 조건제약 포함
옵션좋아요
새로운 자녀가 호환되는 것으로 간주되는 부모와 일치하는 제약 조건이 있어야하므로 지정해야합니다.
어린이가 남아있는 동안 부모 테이블을 떨어 뜨릴 수 없습니다. 부모 테이블에서 상속 된 경우 하위 테이블의 열이나 제약 조건을 삭제하거나 변경할 수 없습니다.캐스케이드
옵션 (참조섹션 5.14).
Alter Table열 데이터 정의의 변경 사항을 전파하고 상속 계층 구조의 제약 조건을 확인합니다. 다시 말하지만, 다른 테이블에 의존하는 열을 삭제하는 것은를 사용할 때만 가능합니다.캐스케이드
옵션.Alter Table
중복 열 병합 및 거부에 대한 동일한 규칙을 따릅니다.테이블 만들기
.
상속 쿼리는 부모 테이블에서만 액세스 권한 점검을 수행합니다. 예를 들어, 부여업데이트
허가도시
테이블은에서 행을 업데이트 할 수있는 권한을 의미합니다.캐피탈
테이블도 액세스 할 때도시
. 이것은 데이터가 부모 테이블에있는 모양을 보존합니다.캐피탈
추가 보조금 없이는 테이블을 직접 업데이트 할 수 없습니다. 이 규칙에 대한 두 가지 예외는입니다.Truncate
및잠금 테이블
, 자식 테이블에 대한 권한이 항상 점검되는 경우, 부모 테이블에서 수행 된 해당 명령을 통해 직접 또는 재귀 적으로 처리되는지.
비슷한 방식으로 부모 테이블의 행 보안 정책 (참조섹션 5.8)는 상속 쿼리 중에 자식 테이블에서 오는 행에 적용됩니다. 아동 테이블의 정책은 쿼리에 명시 적으로 명명 된 테이블 일 때만 적용됩니다.
외국 테이블 (참조섹션 5.12)는 일반 테이블과 마찬가지로 상속 계층의 일부가 될 수 있습니다. 외국 테이블이 상속 계층의 일부인 경우 해외 테이블에서 지원하지 않는 작업은 전체 계층에서도 지원되지 않습니다.
모든 SQL 명령이 상속 계층에서 작업 할 수있는 것은 아닙니다. 데이터 쿼리, 데이터 수정 또는 스키마 수정에 사용되는 명령 (예 :select
, 업데이트
, 삭제
, 대부분의 변형Alter Table
그러나삽입
또는Alter Table ... Rename
) 일반적으로 자식 테이블을 포함하고 지원하는 기본값전용
그것들을 제외하기위한 표기법. 데이터베이스 유지 관리 및 튜닝을 수행하는 명령 (예 :Reindex
, 진공
) 일반적으로 개별 물리적 테이블에서만 작동하며 상속 계층에 대한 재귀를 지원하지 않습니다. 각 개별 명령의 각 행동은 참조 페이지 (에 문서화되어 있습니다.토토 베이 PostgreSQL : 문서 : 12 : SQL 명령).
상속 기능의 심각한 제한은 인덱스 (고유 한 제약 조건 포함) 및 외국 주요 제약 조건이 상속 자녀가 아닌 단일 테이블에만 적용된다는 것입니다. 이것은 외국의 주요 제약 조건의 참조 및 참조 측면 모두에서 사실입니다.
우리가 선언 한 경우도시
.이름
고유 한
또는 A기본 키
, 이것은 멈추지 않을 것입니다캐피탈
이름을 가진 행이있는 행이있는 테이블도시
. 그리고이 중복 행은 기본적으로 쿼리로 표시됩니다.도시
. 사실, 기본적으로캐피탈
전혀 고유 한 제약 조건이 없으므로 같은 이름의 여러 행을 포함 할 수 있습니다. 당신은에 독특한 제약을 추가 할 수 있습니다캐피탈
, 그러나 이것은에 비해 복제를 방해하지 않습니다.도시
.
마찬가지로, 우리가 그것을 지정하려면도시
.이름
참조
다른 테이블,이 제약 조건은 자동으로 전파되지 않습니다캐피탈
. 이 경우 수동으로 동일하게 추가하여 작업 할 수 있습니다참조
제약 조건캐피탈
.
다른 테이블의 열 지정참조 도시 (이름)
다른 테이블에는 도시 이름을 포함하지만 자본 이름은 포함되지 않습니다. 이 경우에는 좋은 해결 방법이 없습니다.
상속 계층에 대해 구현되지 않은 일부 기능은 선언 파티셔닝을 위해 구현됩니다. 레거시 상속과의 분할이 응용 프로그램에 유용한 지 여부를 결정하는 데 상당한주의가 필요합니다.