이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.토토 PostgreSQL : 문서 : 17 : 5.11. 계승버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

5.8. 상속

포스트그레SQL젠 토토 구현 상속은 데이터베이스 디자이너에게 유용한 도구가 될 수 있습니다. (SQL:1999 이상에서는 유형 상속 기능을 정의합니다. 여기에 설명된 기능과 여러 측면에서 다릅니다.)

예를 들어 시작해 보겠습니다. 우리가 도시를 위한 데이터 모델. 각 주에는 여러 개의 도시가 있지만 단 하나의 도시만 있습니다. 자본. 우리는 수도를 빠르게 되찾고 싶습니다. 특정 주에 대해. 이는 두 개를 생성하여 수행할 수 있습니다. 젠 토토 중 하나는 주의 수도용이고 다른 하나는 주도가 아닌 도시용입니다. 수도. 하지만 데이터를 요청하면 어떻게 되나요? 수도인지 아닌지에 관계없이 도시에 대해? 는 상속 기능은 이 문제를 해결하는 데 도움이 될 수 있습니다. 우리는 정의합니다capitals젠 토토이 다음에서 상속됨도시:

젠 토토 도시 생성(
    이름 텍스트,
    인구 부동,
    고도 int - 피트 단위
);

CREATE TABLE 대문자(
    상태 문자(2)
) 상속(도시);

이 경우,대문자젠 토토상속상위 항목의 모든 열 젠 토토,도시. 주 수도 또한 추가 열이 있습니다.상태그건 상태를 보여줍니다.

포스트그레SQL, 젠 토토은 다음을 수행할 수 있습니다. 0개 이상의 다른 젠 토토에서 상속되며 쿼리는 참조할 수 있습니다. 젠 토토의 모든 행 또는 젠 토토의 모든 행과 해당 젠 토토의 모든 행 하위 젠 토토. 후자의 동작이 기본값입니다. 에 대한 예를 들어, 다음 쿼리는 모든 도시의 이름을 찾습니다. 이상의 고도에 위치한 주도를 포함하여 500피트:

SELECT 이름, 고도
    도시에서
    고도  500;

다음의 샘플 데이터가 제공됩니다.포스트그레SQL튜토리얼(참조섹션 2.1), 이는 다음을 반환합니다.

이름 | 고도
---------+----------
 라스베가스 |     2174
 마리포사 |     1953년
 매디슨 |      845

반면에 다음 쿼리는 모든 도시를 찾습니다. 주도가 아니고 고도가 높은 곳에 위치한 곳 500피트:

SELECT 이름, 고도
    도시에서만
    고도  500인 곳;

   이름 | 고도
---------+----------
 라스베가스 |     2174
 마리포사 |     1953

여기는키워드는 다음을 나타냅니다. 쿼리는 다음에만 적용되어야 합니다.도시, 아래 젠 토토은 제외도시상속 계층 구조에서. 많은 우리가 이미 논의한 명령 —선택, UPDATE그리고삭제— 지원키워드.

또한 젠 토토 이름을 뒤에 붙여 쓸 수 있습니다.*하위 젠 토토이 다음과 같이 명시적으로 지정됩니다. 포함됨:

SELECT 이름, 고도
    도시에서*
    고도  500;

쓰기*필요하지 않습니다. 왜냐하면 이 동작은 기본값입니다(설정을 변경하지 않은 경우). 의sql_inheritance구성 옵션). 그러나 쓰기*추가 젠 토토이 추가될 것임을 강조하는 데 유용할 수 있습니다. 검색했습니다.

어떤 경우에는 특정 젠 토토이 어떤 젠 토토인지 알고 싶을 수도 있습니다. 행이 시작되었습니다. 라는 시스템 열이 있습니다.젠 토토로이드각 젠 토토에 있는 내용을 통해 원본 젠 토토:

SELECT c.tableoid, c.name, c.altitude
도시에서 c
c.altitude  500;

반환:

젠 토토로이드 |   이름 | 고도
--------+------------+----------
   139793 | 라스베가스 |     2174
   139793 | 마리포사 |     1953년
   139798 | 매디슨 |      845

(이 예를 재현하려고 하면 아마도 다음과 같은 결과를 얻게 될 것입니다. 다른 숫자 OID.) 다음과 조인을 수행하여pg_class실제 젠 토토을 볼 수 있습니다 이름:

SELECT p.relname, c.name, c.altitude
도시 c, pg_class p에서
여기서 c.altitude  500 AND c.tableoid = p.oid;

반환:

relname |   이름 | 고도
--------+------------+----------
 도시 | 라스베가스 |     2174
 도시 | 마리포사 |     1953년
 수도 | 매디슨 |      845

상속은 다음의 데이터를 자동으로 전파하지 않습니다.삽입또는복사상속 계층의 다른 젠 토토에 명령합니다. 우리의 예를 들면 다음과 같습니다삽입문장 실패합니다:

도시에 삽입(이름, 인구, 고도, 주)
VALUES ('뉴욕', NULL, NULL, '뉴욕');

우리는 데이터가 어떻게든 다음으로 라우팅되기를 바랄 수 있습니다.대문자젠 토토이지만 이것은 그렇지 않습니다. 발생:삽입항상 삽입됨 정확히 지정된 젠 토토입니다. 어떤 경우에는 다음이 가능합니다. 규칙을 사용하여 삽입을 리디렉션합니다(참조제36장). 그러나 그것은 에 도움이 되지 않습니다 위의 경우는 다음과 같습니다.도시젠 토토 열을 포함하지 않습니다.상태, 따라서 규칙이 적용되기 전에 명령이 거부됩니다. 적용되었습니다.

상위 항목에 대한 모든 검사 제약 조건 및 null이 아닌 제약 조건 젠 토토은 해당 자식에게 자동으로 상속됩니다. 다른 유형 제약 조건(고유 키, 기본 키, 외래 키 제약 조건) 상속되지 않습니다.

젠 토토은 둘 이상의 상위 젠 토토에서 상속될 수 있습니다. 상위 항목에 의해 정의된 열의 합집합이 있는 경우 젠 토토. 하위 젠 토토 정의에 선언된 모든 열은 다음과 같습니다. 이것들에 추가되었습니다. 동일한 컬럼명이 여러개 나타나는 경우 상위 젠 토토 또는 상위 젠 토토과 하위 젠 토토 모두 정의하면 이 열은"병합"따라서 다음에는 그러한 열이 하나만 있습니다. 아이 젠 토토. 병합하려면 열에 동일한 데이터가 있어야 합니다. 유형을 지정하지 않으면 오류가 발생합니다. 병합된 열에는 다음 중 하나에서 오는 모든 검사 제약 조건의 복사본 해당 열 정의는 null이 아닌 것으로 표시됩니다. 그 중 하나입니다.

젠 토토 상속은 일반적으로 하위 항목이 젠 토토은 다음을 사용하여 생성됩니다.상속의 절PostgreSQL : 문서 : 8.4 : 롤 토토 작성성명. 또는 이미 존재하는 젠 토토 호환 가능한 방식으로 정의되면 새로운 상위 관계를 가질 수 있습니다. 추가, 사용하여상속변형사설 토토 PostgreSQL : 문서 : 8.4 : Alter Table. 해야 할 일 새 하위 젠 토토에는 이미 다음과 같은 열이 포함되어 있어야 합니다. 상위 열과 이름 및 유형이 동일합니다. 또한 동일한 이름을 가진 검사 제약 조건을 포함하고 검사합니다. 표현은 부모의 표현과 동일합니다. 마찬가지로 상속 링크 다음을 사용하여 어린이에게서 제거할 수 있습니다.아니요 상속변형젠 토토 변경. 이와 같은 상속 링크를 동적으로 추가 및 제거할 수 있습니다. 상속 관계를 사용할 때 유용합니다. 젠 토토 파티셔닝(참조PostgreSQL : 문서 : 8.4 : 젠 토토).

호환되는 젠 토토을 생성하는 편리한 방법 중 하나는 다음과 같습니다. 나중에 새로운 자식을 만들려면좋아요만들기 표. 그러면 다음과 동일한 열이 포함된 새 젠 토토이 생성됩니다. 소스 젠 토토. 있다면확인소스 젠 토토에 정의된 제약 조건,제약조건 포함옵션좋아요새 하위 항목이 다음과 같이 지정되어야 합니다. 고려할 상위 항목과 일치하는 제약 조건이 있음 호환됩니다.

상위 젠 토토은 하위 젠 토토이 있는 동안 삭제할 수 없습니다. 남아있다. 하위 젠 토토의 열이나 제약 조건을 확인할 수 없습니다. 부모로부터 상속된 경우 삭제되거나 변경됩니다. 젠 토토. 젠 토토과 그 하위 항목을 모두 제거하려면 다음을 수행하십시오. 한 가지 쉬운 방법은를 사용하여 상위 젠 토토을 삭제하는 것입니다.캐스케이드옵션.

사설 토토 PostgreSQL : 문서 : 8.4 : Alter Table할 것이다 열 데이터 정의의 변경 사항을 전파하고 확인합니다. 상속 계층 구조를 제한합니다. 또, 하락 다른 젠 토토에 의존하는 열만 가능합니다. 사용할 때캐스케이드옵션.젠 토토 변경동일한 규칙을 따릅니다. 동안 적용되는 중복 열 병합 및 거부젠 토토 생성.

5.8.1. 주의사항

젠 토토 액세스 권한은 자동으로 상속되지 않습니다. 따라서 상위 젠 토토에 액세스하려는 사용자는 다음을 수행해야 합니다. 모든 항목에 대해 동일한 작업을 수행할 수 있는 권한이 있거나 하위 젠 토토도 마찬가지입니다. 그렇지 않으면표기법. 새로운 하위 젠 토토을 추가할 때 기존 상속 계층 구조를 모두 부여하도록 주의하세요. 그것에 대한 권한이 필요합니다.

더 일반적으로 모든 SQL 명령이 다음을 수행할 수 있는 것은 아닙니다. 상속 계층에 대해 작업합니다. 다음에 사용되는 명령 데이터 쿼리, 데이터 수정 또는 스키마 수정(예:선택, 업데이트, 삭제, 대부분 의 변형젠 토토 변경하지만 아님삽입또는변경 젠 토토 ... 이름 바꾸기)는 일반적으로 기본적으로 하위 항목을 포함합니다. 젠 토토을 지원하고표기법 그들을 제외합니다. 데이터베이스 유지 관리를 수행하는 명령 및 튜닝(예:REINDEX, 진공)는 일반적으로 개인에게만 작동합니다. 물리적 젠 토토이며 상속에 대한 반복을 지원하지 않습니다. 계층. 각 개별 명령의 해당 동작 참조 페이지()에 설명되어 있습니다.참조 I,SQL 명령).

상속 기능의 심각한 제한은 다음과 같습니다. 인덱스(고유 제약 조건 포함) 및 외래 키 제약 조건은 단일 젠 토토에만 적용되며 해당 젠 토토에는 적용되지 않습니다. 상속 자녀. 이는 참조 및 참조 모두에 해당됩니다. 외래 키 제약 조건의 참조 측면. 따라서, 위 예의 조건:

  • 우리가 선언한다면도시.이름되다고유또는기본 키, 이것은 멈추지 않을 것입니다.대문자행이 있는 젠 토토 이름이 행을 복제하는 경우도시. 그리고 그 중복 행은 기본적으로 다음의 쿼리에 표시됩니다.도시. 실제로 기본적으로대문자고유 제약조건이 없습니다. 따라서 동일한 내용을 가진 여러 행이 포함될 수 있습니다. 이름. 고유 제약 조건을 추가할 수 있습니다.대문자, 그러나 이것이 방해가 되지는 않습니다. 중복과 비교도시.

  • 마찬가지로 우리가 그것을 지정한다면도시.이름 참조다른 젠 토토, 이것은 제약 조건이 자동으로 전파되지 않습니다.대문자. 이 경우에는 일할 수 있습니다. 수동으로 추가하여 주변에 동일한 내용을 추가합니다.참조다음으로 제한대문자.

  • 다른 젠 토토의 열을 지정참조 도시(이름)허용할 것입니다 다른 젠 토토에는 도시 이름이 포함되지만 대문자 이름은 포함되지 않습니다. 이 경우에는 좋은 해결 방법이 없습니다.

이러한 결함은 아마도 미래에 수정될 것입니다 하지만 그 동안에는 상당한 주의가 필요합니다. 상속이 귀하에게 유용한지 여부를 결정합니다. 신청합니다.