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

5.8. 상속

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

예를 들어 시작해 보겠습니다. 도시에 대한 데이터 모델을 구축하려고 한다고 가정해 보겠습니다. 각 주에는 많은 도시가 있지만 수도는 하나뿐입니다. 우리는 특정 주의 수도를 신속하게 검색할 수 있기를 원합니다. 이는 주 수도에 대한 테이블과 수도가 아닌 도시에 대한 테이블 등 두 개의 테이블을 생성하여 수행할 수 있습니다. 그런데 수도인지 아닌지에 관계없이 도시에 대한 데이터를 요청하면 어떻게 될까요? 상속 기능은 이 문제를 해결하는 데 도움이 될 수 있습니다. 우리는 다음을 정의합니다.대문자스포츠 토토 사이트서 상속받도록도시:

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

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

이 경우,대문자테이블상속상위 테이블의 모든 열,도시. 주 수도에는 추가 열도 있습니다.상태, 상태를 보여줍니다.

PostgreSQL, 테이블은 0개 이상의 다른 테이블에서 상속할 수 있으며 쿼리는 테이블의 모든 행 또는 테이블의 모든 행과 모든 하위 테이블을 참조할 수 있습니다. 후자의 동작이 기본값입니다. 예를 들어 다음 쿼리는 주도를 포함하여 고도 500피트 이상에 위치한 모든 도시의 이름을 찾습니다.

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

다음의 샘플 데이터가 제공됩니다.PostgreSQL튜토리얼(참조PostgreSQL : 문서 : 9.4 : 젠 토토), 이는 다음을 반환합니다.

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

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

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

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

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

테이블 이름을 뒤에 붙여 쓸 수도 있습니다.*하위 테이블이 포함되도록 명시적으로 지정하려면:

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

작성*이 동작이 기본값이므로 필요하지 않습니다(설정을 변경하지 않은 경우sql_inheritance구성 옵션). 그러나 쓰기*추가 테이블이 검색된다는 점을 강조하는 데 유용할 수 있습니다.

어떤 경우에는 특정 행이 어느 테이블에서 유래되었는지 알고 싶을 수도 있습니다. 라는 시스템 열이 있습니다.테이블로이드원본 테이블을 알려줄 수 있는 각 테이블에서:

SELECT c.tableoid, c.이름, c.고도
도시에서 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

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

INSERT INTO 도시(이름, 인구, 고도, 주)
VALUES ('뉴욕', NULL, NULL, '뉴욕');

우리는 데이터가 어떻게든 다음으로 라우팅되기를 바랍니다.대문자테이블이지만 이런 일은 발생하지 않습니다.삽입항상 지정된 테이블에 정확히 삽입됩니다. 어떤 경우에는 규칙을 사용하여 삽입을 리디렉션할 수 있습니다(참조PostgreSQL : 문서 : 9.4 : 토토 커뮤니티 시스템). 그러나 위의 경우에는 도움이 되지 않습니다. 왜냐하면도시테이블에 열이 포함되어 있지 않습니다.상태따라서 규칙이 적용되기 전에 명령이 거부됩니다.

상위 테이블의 모든 검사 제약 조건과 null이 아닌 제약 조건은 해당 하위 테이블에 자동으로 상속됩니다. 다른 유형의 제약 조건(고유 키, 기본 키 제약 조건, 외래 키 제약 조건)은 상속되지 않습니다.

테이블은 하나 이상의 상위 테이블로부터 상속받을 수 있으며, 이 경우 상위 테이블에 의해 정의된 열의 통합을 갖습니다. 하위 테이블의 정의에 선언된 모든 열이 여기에 추가됩니다. 동일한 열 이름이 여러 상위 테이블에 나타나거나 상위 테이블과 하위 정의 모두에 나타나는 경우 이러한 열은 다음과 같습니다."병합"그래서 하위 테이블에는 그러한 열이 하나만 있습니다. 병합하려면 열의 데이터 유형이 동일해야 하며, 그렇지 않으면 오류가 발생합니다. 병합된 열에는 해당 열 정의 중 하나에서 오는 모든 확인 제약 조건의 복사본이 있으며, 해당 열 정의 중 하나라도 있으면 null이 아닌 것으로 표시됩니다.

테이블 상속은 일반적으로 하위 테이블이 생성될 때 다음을 사용하여 설정됩니다.상속됨의 절PostgreSQL : 문서 : 9.4 : 메이저 토토 사이트 작성문장. 또는 이미 호환 가능한 방식으로 정의된 테이블에 다음을 사용하여 새로운 상위 관계를 추가할 수 있습니다.상속변형무지개 토토 PostgreSQL : 문서 : 9.4 : Alter Table. 이를 수행하려면 새 하위 테이블에 상위 열과 이름 및 유형이 동일한 열이 이미 포함되어 있어야 합니다. 또한 상위 항목과 이름 및 검사 표현식이 동일한 검사 제약 조건도 포함해야 합니다. 마찬가지로, 다음을 사용하여 상속 링크를 하위 항목에서 제거할 수 있습니다.상속 없음변형테이블 변경. 이와 같은 상속 링크를 동적으로 추가하고 제거하는 것은 상속 관계가 테이블 파티셔닝에 사용될 때 유용할 수 있습니다(참조)스포츠 토토 결과 PostgreSQL : 문서 : 9.4 : 파티셔닝).

나중에 새로운 하위 항목이 될 호환 테이블을 생성하는 편리한 방법 중 하나는 다음을 사용하는 것입니다.좋아요테이블 생성. 이렇게 하면 소스 테이블과 동일한 열이 있는 새 테이블이 생성됩니다. 있다면확인소스 테이블에 정의된 제약 조건,제약조건 포함옵션좋아요새 하위 항목이 호환 가능한 것으로 간주되려면 상위 항목과 일치하는 제약 조건을 가져야 하므로 지정해야 합니다.

상위 테이블은 하위 테이블이 남아 있는 동안 삭제할 수 없습니다. 하위 테이블의 열이나 검사 제약 조건이 상위 테이블에서 상속된 경우 삭제되거나 변경될 수 없습니다. 테이블과 그 하위 항목을 모두 제거하려는 경우 쉬운 방법 중 하나는 다음을 사용하여 상위 테이블을 삭제하는 것입니다.캐스케이드옵션.

무지개 토토 PostgreSQL : 문서 : 9.4 : Alter Table열 데이터 정의의 변경 사항을 전파하고 상속 계층 구조 아래로 제약 조건을 확인합니다. 다시 말하지만, 다른 테이블에 의존하는 열을 삭제하는 것은캐스케이드옵션.테이블 변경중복 열 병합 및 거부에 대해 적용되는 동일한 규칙을 따릅니다.테이블 생성.

테이블 액세스 권한이 어떻게 처리되는지 참고하세요. 상위 테이블을 쿼리하면 추가 액세스 권한 확인 없이 자동으로 하위 테이블의 데이터에 액세스할 수 있습니다. 이렇게 하면 데이터가 상위 테이블에도 있는 것처럼 보입니다. 그러나 하위 테이블에 직접 액세스하는 것은 자동으로 허용되지 않으며 추가 권한을 부여해야 합니다. 이 규칙에 대한 두 가지 예외는 다음과 같습니다.잘라내기그리고락 테이블, 여기서 하위 테이블에 대한 권한은 직접 처리되거나 상위 테이블에서 수행되는 명령을 통해 재귀적으로 처리되는지 여부를 항상 확인합니다.

5.8.1. 주의사항

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

상속 기능의 심각한 제한은 인덱스(고유 제약 조건 포함)와 외래 키 제약 조건이 상속 하위 항목이 아닌 단일 테이블에만 적용된다는 것입니다. 이는 외래 키 제약 조건의 참조 측면과 참조 측면 모두에 해당됩니다. 따라서 위 예의 관점에서 보면 다음과 같습니다.

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

  • 마찬가지로 우리가 그것을 지정한다면도시.이름 참조다른 테이블, 이 제약조건은 자동으로 전파되지 않습니다.대문자. 이 경우 동일한 항목을 수동으로 추가하여 문제를 해결할 수 있습니다.참조다음으로 제한대문자.

  • 다른 테이블의 열을 지정참조 도시(이름)다른 테이블에는 도시 이름이 포함될 수 있지만 대문자 이름은 포함되지 않습니다. 이 경우에는 좋은 해결 방법이 없습니다.

이러한 결함은 향후 릴리스에서 아마도 수정될 것이지만 그 동안 상속이 귀하의 응용 프로그램에 유용한지 결정하는 데 상당한 주의가 필요합니다.