PostgreSQL데이터베이스 설계자에게 유용한 도구가 될 수 있는 테이블 상속을 구현합니다. (SQL:1999 이상에서는 여기에 설명된 기능과 여러 측면에서 다른 유형 상속 기능을 정의합니다.)
예를 들어 시작해 보겠습니다. 도시에 대한 데이터 모델을 구축하려고 한다고 가정해 보겠습니다. 각 주에는 많은 도시가 있지만 수도는 하나뿐입니다. 우리는 특정 주의 수도를 신속하게 검색할 수 있기를 원합니다. 이는 주 수도에 대한 테이블과 수도가 아닌 도시에 대한 테이블 등 두 개의 테이블을 생성하여 수행할 수 있습니다. 그런데 수도인지 아닌지에 관계없이 도시에 대한 데이터를 요청하면 어떻게 될까요? 상속 기능은 이 문제를 해결하는 데 도움이 될 수 있습니다. 우리는 다음을 정의합니다.대문자토토 사이트 추천서 상속받도록도시:
테이블 도시 생성(
이름 텍스트,
인구 부동,
고도 int - 피트 단위
);
CREATE TABLE 대문자(
상태 문자(2)
) 상속(도시);
이 경우,대문자테이블상속상위 테이블의 모든 열,도시. 주 수도에는 추가 열도 있습니다.상태, 상태를 보여줍니다.
에포스트그레SQL, 테이블은 0개 이상의 다른 테이블에서 상속할 수 있으며 쿼리는 테이블의 모든 행 또는 테이블의 모든 행과 모든 하위 테이블을 참조할 수 있습니다. 후자의 동작이 기본값입니다. 예를 들어 다음 쿼리는 주도를 포함하여 고도가 500피트 이상인 모든 도시의 이름을 찾습니다.
SELECT 이름, 고도
도시에서
고도 500;
다음의 샘플 데이터가 제공됩니다.포스트그레SQL튜토리얼(참조스포츠 토토 : 문서 : 16 : 2.1. 소개), 이는 다음을 반환합니다.
이름 | 고도 ---------+------------ 라스베가스 | 2174 마리포사 | 1953년 매디슨 | 845
반면에 다음 쿼리는 주도가 아니고 해발 500피트 이상의 고도에 위치한 모든 도시를 찾습니다.
SELECT 이름, 고도
도시에서만
고도 500인 곳;
이름 | 고도
---------+------------
라스베가스 | 2174
마리포사 | 1953
여기는만키워드는 쿼리가 다음에만 적용되어야 함을 나타냅니다.도시, 아래 테이블은 제외도시상속 계층에서. 우리가 이미 논의한 많은 명령 —선택, 업데이트그리고삭제— 지원만키워드.
테이블 이름을 뒤에 붙여 쓸 수도 있습니다.*하위 테이블이 포함되도록 명시적으로 지정하려면:
SELECT 이름, 고도
도시에서*
고도 500;
쓰기*이 동작은 항상 기본값이므로 필요하지 않습니다. 그러나 이 구문은 기본값이 변경될 수 있는 이전 릴리스와의 호환성을 위해 계속 지원됩니다.
어떤 경우에는 특정 행이 어느 테이블에서 유래되었는지 알고 싶을 수도 있습니다. 라는 시스템 열이 있습니다.테이블로이드원본 테이블을 알려줄 수 있는 각 테이블에서:
SELECT c.tableoid, c.name, c.elevation 도시에서 c c.elevation 500;
반환:
테이블로이드 | 이름 | 고도 ---------+------------+------------ 139793 | 라스베가스 | 2174 139793 | 마리포사 | 1953년 139798 | 매디슨 | 845
(이 예를 재현하려고 하면 아마도 다른 숫자 OID를 얻게 될 것입니다.) 다음과 조인함으로써pg_class실제 테이블 이름을 볼 수 있습니다:
SELECT p.relname, c.name, c.elevation 도시 c, pg_class p에서 여기서 c.elevation 500 AND c.tableoid = p.oid;
반환:
relname | 이름 | 고도 ---------+------------+------------ 도시 | 라스베가스 | 2174 도시 | 마리포사 | 1953년 수도 | 매디슨 | 845
동일한 효과를 얻는 또 다른 방법은 다음을 사용하는 것입니다.regclass별칭 유형, 테이블 OID를 기호적으로 인쇄합니다.
SELECT c.tableoid::regclass, c.name, c.elevation 도시에서 c c.elevation 500;
상속은 다음의 데이터를 자동으로 전파하지 않습니다.삽입또는복사상속 계층의 다른 테이블에 명령합니다. 이 예에서는 다음과 같습니다삽입문이 실패합니다:
도시에 삽입(이름, 인구, 고도, 주)
VALUES ('Albany', NULL, NULL, 'NY');
우리는 데이터가 어떻게든 다음으로 라우팅되기를 바랄 수 있습니다.대문자테이블이지만 이런 일은 발생하지 않습니다:삽입항상 지정된 테이블에 정확히 삽입됩니다. 어떤 경우에는 규칙을 사용하여 삽입을 리디렉션할 수 있습니다(참조와이즈 토토 : 문서 : 16 : 41 장. 규칙 시스템). 그러나 위의 경우에는 도움이 되지 않습니다. 왜냐하면도시테이블에 열이 포함되어 있지 않습니다.상태따라서 규칙이 적용되기 전에 명령이 거부됩니다.
상위 테이블의 모든 검사 제약 조건과 null이 아닌 제약 조건은 별도로 명시적으로 지정하지 않는 한 자동으로 해당 하위 테이블에 상속됩니다.상속 없음절. 다른 유형의 제약 조건(고유 키, 기본 키 제약 조건, 외래 키 제약 조건)은 상속되지 않습니다.
테이블은 하나 이상의 상위 테이블로부터 상속받을 수 있으며, 이 경우 상위 테이블에 의해 정의된 열의 통합을 갖습니다. 하위 테이블의 정의에 선언된 모든 열이 여기에 추가됩니다. 동일한 열 이름이 여러 상위 테이블에 나타나거나 상위 테이블과 하위 정의 모두에 나타나는 경우 이러한 열은 다음과 같습니다.“병합”하위 테이블에는 그러한 열이 하나만 있습니다. 병합하려면 열의 데이터 유형이 동일해야 하며, 그렇지 않으면 오류가 발생합니다. 상속 가능한 검사 제약 조건과 null이 아닌 제약 조건은 비슷한 방식으로 병합됩니다. 따라서 예를 들어 병합된 열은 해당 열의 원본 열 정의 중 하나가 not-null로 표시된 경우 not-null로 표시됩니다. 확인 제약 조건은 이름이 같으면 병합되고, 조건이 다르면 병합이 실패합니다.
테이블 상속은 일반적으로 하위 테이블이 생성될 때 다음을 사용하여 설정됩니다.상속됨의 절테이블 생성문장. 또는 호환 가능한 방식으로 이미 정의된 테이블에 다음을 사용하여 새로운 상위 관계를 추가할 수 있습니다.상속변형테이블 변경. 이를 수행하려면 새 하위 테이블에 상위 열과 이름 및 유형이 동일한 열이 이미 포함되어 있어야 합니다. 또한 상위 항목과 이름 및 검사 표현식이 동일한 검사 제약 조건도 포함해야 합니다. 마찬가지로, 다음을 사용하여 상속 링크를 하위 항목에서 제거할 수 있습니다.상속 없음변형테이블 변경. 이와 같은 상속 링크를 동적으로 추가하고 제거하는 것은 상속 관계가 테이블 파티셔닝에 사용될 때 유용할 수 있습니다(참조)배트맨 토토 PostgreSQL : 문서 : 16 : 5.11. 테이블 파티셔닝).
나중에 새로운 하위 항목이 될 호환 테이블을 생성하는 편리한 방법 중 하나는 다음을 사용하는 것입니다.좋아요절테이블 생성. 이렇게 하면 소스 테이블과 동일한 열이 있는 새 테이블이 생성됩니다. 있다면확인소스 테이블에 정의된 제약 조건,제약조건 포함옵션좋아요새 하위 항목에는 호환 가능한 것으로 간주되기 위해 상위 항목과 일치하는 제약 조건이 있어야 하므로 지정해야 합니다.
상위 테이블은 하위 테이블이 남아 있는 동안 삭제할 수 없습니다. 하위 테이블의 열이나 검사 제약 조건이 상위 테이블에서 상속된 경우 삭제되거나 변경될 수 없습니다. 테이블과 그 하위 항목을 모두 제거하려는 경우 쉬운 방법 중 하나는 다음을 사용하여 상위 테이블을 삭제하는 것입니다.캐스케이드옵션(참조와이즈 토토 : 문서 : 16 : 5.14. 의존성 추적).
테이블 변경열 데이터 정의의 변경 사항을 전파하고 상속 계층 구조 아래로 제약 조건을 확인합니다. 다시 말하지만, 다른 테이블에 의존하는 열을 삭제하는 것은캐스케이드옵션.테이블 변경중복 열 병합 및 거부에 대해 적용되는 동일한 규칙을 따릅니다.테이블 생성.
상속된 쿼리는 상위 테이블에서만 액세스 권한 확인을 수행합니다. 따라서 예를 들어, 다음과 같이 부여합니다.업데이트에 대한 권한도시테이블은 다음의 행을 업데이트할 수 있는 권한을 의미합니다.대문자테이블도 다음을 통해 액세스할 때도시. 이렇게 하면 데이터가 상위 테이블에도 있는 것처럼 보입니다. 하지만대문자추가 권한 없이 테이블을 직접 업데이트할 수 없습니다. 비슷한 방식으로 상위 테이블의 행 보안 정책(참조PostgreSQL : 문서 : 16 : 5.8. 보안 토토 베이 행)은 상속된 쿼리 중에 하위 테이블에서 오는 행에 적용됩니다. 하위 테이블의 정책(있는 경우)은 쿼리에서 명시적으로 명명된 테이블인 경우에만 적용됩니다. 이 경우 상위 항목에 연결된 모든 정책은 무시됩니다.
외부 테이블(참조PostgreSQL : 문서 : 16 : 5.12. 외국 토토)은 일반 테이블과 마찬가지로 상위 또는 하위 테이블로 상속 계층의 일부일 수도 있습니다. 외부 테이블이 상속 계층 구조의 일부인 경우 외부 테이블에서 지원되지 않는 작업은 전체 계층 구조에서도 지원되지 않습니다.
모든 SQL 명령이 상속 계층에서 작동할 수 있는 것은 아닙니다. 데이터 쿼리, 데이터 수정 또는 스키마 수정에 사용되는 명령(예:선택, 업데이트, 삭제, 대부분의 변형테이블 변경하지만 아님삽입또는테이블 변경 ... 이름 바꾸기)은 일반적으로 기본적으로 하위 테이블을 포함하고 다음을 지원합니다.만제외하는 표기법입니다. 데이터베이스 유지 관리 및 조정을 수행하는 명령(예:REINDEX, 진공)은 일반적으로 개별 물리적 테이블에서만 작동하며 상속 계층에 대한 반복을 지원하지 않습니다. 각 개별 명령의 해당 동작은 해당 참조 페이지(스포츠 토토 PostgreSQL : 문서 : 16 : SQL 명령).
상속 기능의 심각한 제한은 인덱스(고유 제약 조건 포함)와 외래 키 제약 조건이 상속 하위 항목이 아닌 단일 테이블에만 적용된다는 것입니다. 이는 외래 키 제약 조건의 참조 측면과 참조 측면 모두에 해당됩니다. 따라서 위 예의 관점에서 보면 다음과 같습니다.
우리가 선언한다면도시.이름되다고유또는 a기본 키, 이것은 멈추지 않을 것입니다.대문자테이블에 이름이 중복되는 행이 있는 경우도시. 그리고 이러한 중복 행은 기본적으로 다음의 쿼리에 표시됩니다.도시. 실제로 기본적으로대문자에는 고유 제약 조건이 전혀 없으므로 동일한 이름을 가진 여러 행이 포함될 수 있습니다. 고유 제약 조건을 추가할 수 있습니다.대문자, 그러나 이는에 비해 중복을 방지하지 못합니다.도시.
마찬가지로 우리가 그것을 지정한다면도시.이름 참조다른 테이블, 이 제약조건은 자동으로 전파되지 않습니다.대문자. 이 경우 동일한 항목을 수동으로 추가하여 문제를 해결할 수 있습니다.참조다음으로 제한대문자.
다른 테이블의 열을 지정참조 도시(이름)다른 테이블에는 도시 이름이 포함될 수 있지만 대문자 이름은 포함되지 않습니다. 이 경우에는 좋은 해결 방법이 없습니다.
상속 계층에 대해 구현되지 않은 일부 기능은 선언적 파티셔닝을 위해 구현되었습니다. 레거시 상속을 사용한 분할이 애플리케이션에 유용한지 여부를 결정할 때는 상당한 주의가 필요합니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.