포스트그레SQL범퍼카 토토 구현 상속은 데이터베이스 디자이너에게 유용한 도구가 될 수 있습니다. (SQL:1999 이상에서는 유형 상속 기능을 정의합니다. 여기에 설명된 기능과 여러 측면에서 다릅니다.)
예를 들어 시작해 보겠습니다. 우리가 도시를 위한 데이터 모델. 각 주에는 여러 개의 도시가 있지만 단 하나의 도시만 있습니다. 자본. 우리는 수도를 빠르게 되찾고 싶습니다. 특정 주에 대해. 이는 두 개를 생성하여 수행할 수 있습니다. 범퍼카 토토 중 하나는 주의 수도용이고 다른 하나는 주도가 아닌 도시용입니다. 수도. 하지만 데이터를 요청하면 어떻게 되나요? 수도인지 아닌지에 관계없이 도시에 대해? 는 상속 기능은 이 문제를 해결하는 데 도움이 될 수 있습니다. 우리는 정의합니다대문자범퍼카 토토이 다음에서 상속됨도시:
범퍼카 토토 도시 생성(
이름 텍스트,
인구 부동,
고도 int - 피트 단위
);
CREATE TABLE 대문자(
상태 문자(2)
) 상속(도시);
이 경우,대문자범퍼카 토토상속상위 항목의 모든 열 범퍼카 토토,도시. 주 수도 또한 추가 열이 있습니다.상태그건 상태를 보여줍니다.
에포스트그레SQL, 범퍼카 토토은 0개 이상의 다른 범퍼카 토토에서 상속되며 쿼리는 참조할 수 있습니다. 범퍼카 토토의 모든 행 또는 범퍼카 토토의 모든 행과 해당 범퍼카 토토의 모든 행 하위 범퍼카 토토. 후자의 동작이 기본값입니다. 에 대한 예를 들어, 다음 쿼리는 모든 도시의 이름을 찾습니다. 이상의 고도에 위치한 주도를 포함하여 500피트:
SELECT 이름, 고도
도시에서
고도 500;
다음의 샘플 데이터가 제공됩니다.포스트그레SQL튜토리얼(참조섹션 2.1), 이는 다음을 반환합니다.
이름 | 고도 ---------+---------- 라스베가스 | 2174 마리포사 | 1953년 매디슨 | 845
반면에 다음 쿼리는 모든 도시를 찾습니다. 주도가 아니고 고도가 높은 곳에 위치한 곳 500피트:
SELECT 이름, 고도
도시에서만
고도 500인 곳;
이름 | 고도
---------+----------
라스베가스 | 2174
마리포사 | 1953
여기만키워드는 다음을 나타냅니다. 쿼리는 다음에만 적용되어야 합니다.도시, 아래 범퍼카 토토은 제외도시상속 계층에서. 많은 우리가 이미 논의한 명령 —선택, 업데이트그리고삭제— 지원만키워드.
어떤 경우에는 특정 범퍼카 토토이 어떤 것인지 알고 싶을 수도 있습니다. 행이 시작되었습니다. 라는 시스템 열이 있습니다.범퍼카 토토로이드각 범퍼카 토토에 있는 내용은 다음과 같습니다. 원본 범퍼카 토토:
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 및 c.tableoid = p.oid;
반환:
relname | 이름 | 고도 --------+------------+---------- 도시 | 라스베가스 | 2174 도시 | 마리포사 | 1953년 수도 | 매디슨 | 845
상속은 다음의 데이터를 자동으로 전파하지 않습니다.삽입또는복사상속 계층의 다른 범퍼카 토토에 명령합니다. 우리의 예를 들면 다음과 같습니다삽입문장 실패합니다:
INSERT INTO 도시(이름, 인구, 고도, 주)
VALUES ('뉴욕', NULL, NULL, '뉴욕');
우리는 데이터가 어떻게든 다음으로 라우팅되기를 바랄 수 있습니다.대문자범퍼카 토토이지만 이것은 그렇지 않습니다. 발생:삽입항상 다음 위치에 삽입됩니다. 정확히 지정된 범퍼카 토토입니다. 어떤 경우에는 다음이 가능합니다. 규칙을 사용하여 삽입을 리디렉션합니다(참조제35장). 그러나 그것은 에 도움이 되지 않습니다 위의 경우는 다음과 같습니다.도시범퍼카 토토 열을 포함하지 않습니다.상태, 따라서 규칙이 적용되기 전에 명령이 거부됩니다. 적용되었습니다.
상위 항목에 대한 모든 검사 제약 조건 및 null이 아닌 제약 조건 범퍼카 토토은 해당 자식에게 자동으로 상속됩니다. 다른 유형 제약 조건(고유 키, 기본 키, 외래 키 제약 조건) 상속되지 않습니다.
범퍼카 토토은 둘 이상의 상위 범퍼카 토토에서 상속될 수 있습니다. 상위 항목에 의해 정의된 열의 합집합이 있는 경우 범퍼카 토토. 하위 범퍼카 토토 정의에 선언된 모든 열은 다음과 같습니다. 이것들에 추가되었습니다. 동일한 컬럼명이 여러개 나타나는 경우 상위 범퍼카 토토 또는 상위 범퍼카 토토과 하위 범퍼카 토토 모두 정의하면 이 열은"병합"따라서 다음에는 그러한 열이 하나만 있습니다. 아이 범퍼카 토토. 병합하려면 열에 동일한 데이터가 있어야 합니다. 유형을 지정하지 않으면 오류가 발생합니다. 병합된 열에는 다음 중 하나에서 오는 모든 검사 제약 조건의 복사본 해당 열 정의는 null이 아닌 것으로 표시됩니다. 그 중 하나입니다.
범퍼카 토토 상속은 일반적으로 하위 항목이 범퍼카 토토은 다음을 사용하여 생성됩니다.상속됨의 절PostgreSQL : 문서 : 8.2 : 젠 토토 작성성명. 또는 이미 존재하는 범퍼카 토토 호환 가능한 방식으로 정의되면 새로운 상위 관계를 가질 수 있습니다. 추가, 사용하여상속변형토토 사이트 추천 PostgreSQL : 문서 : 8.2 : Alter Table. 해야 할 일 새 하위 범퍼카 토토에는 이미 다음과 같은 열이 포함되어 있어야 합니다. 상위 열과 이름 및 유형이 동일합니다. 또한 동일한 이름을 가진 검사 제약 조건을 포함하고 검사합니다. 표현은 부모의 표현과 동일합니다. 마찬가지로 상속 링크 다음을 사용하여 어린이에게서 제거할 수 있습니다.아니요 상속변형범퍼카 토토 변경. 이와 같은 상속 링크를 동적으로 추가 및 제거할 수 있습니다. 상속 관계를 사용할 때 유용합니다. 범퍼카 토토 파티셔닝(참조PostgreSQL : 문서 : 8.2 : 토토 핫셔닝).
호환되는 범퍼카 토토을 생성하는 편리한 방법 중 하나는 다음과 같습니다. 나중에 새로운 자식을 만들려면좋아요절만들기 표. 그러면 다음과 동일한 열이 포함된 새 범퍼카 토토이 생성됩니다. 소스 범퍼카 토토. 있다면확인소스 범퍼카 토토에 정의된 제약 조건,제약조건 포함옵션좋아요새 하위 항목이 다음과 같이 지정되어야 합니다. 고려할 상위 항목과 일치하는 제약 조건이 있음 호환됩니다.
상위 범퍼카 토토은 하위 범퍼카 토토이 있는 동안 삭제할 수 없습니다. 남아있다. 하위 범퍼카 토토의 열을 삭제하거나 변경할 수도 없습니다. 상위 범퍼카 토토에서 상속된 경우. 당신이 원한다면 범퍼카 토토과 모든 하위 항목을 제거하는 쉬운 방법 중 하나는 다음과 같습니다. 를 사용하여 상위 범퍼카 토토을 삭제합니다.캐스케이드옵션.
토토 사이트 추천 PostgreSQL : 문서 : 8.2 : Alter Table할 것이다 열 데이터 정의의 변경 사항을 전파하고 확인합니다. 상속 계층 구조를 제한합니다. 또, 떨어뜨려 상위 범퍼카 토토의 열이나 제약 조건은 다음 경우에만 가능합니다. 를 사용하여캐스케이드옵션.범퍼카 토토 변경중복에 대해서도 동일한 규칙을 따릅니다. 동안 적용되는 열 병합 및 거부범퍼카 토토 생성.
범퍼카 토토 액세스 권한은 자동으로 상속되지 않습니다. 따라서 상위 범퍼카 토토에 액세스하려는 사용자는 다음을 수행해야 합니다. 모든 하위 항목에 대해 작업을 수행할 수 있는 권한이 있거나 범퍼카 토토도 마찬가지입니다. 그렇지 않으면만표기법. 기존 범퍼카 토토에 새 하위 범퍼카 토토을 추가하는 경우 상속 계층 구조, 필요한 모든 항목을 부여하도록 주의하세요. 그것에 대한 권한이 있습니다.
상속 기능의 심각한 제한은 다음과 같습니다. 인덱스(고유 제약 조건 포함) 및 외래 키 제약 조건은 단일 범퍼카 토토에만 적용되며 해당 범퍼카 토토에는 적용되지 않습니다. 상속 자녀. 이는 참조 및 참조 모두에 해당됩니다. 외래 키 제약 조건의 참조 측면. 따라서, 위 예의 조건:
만약 우리가 선언한다면도시.이름되다고유또는 a기본 키, 이것은 멈추지 않을 것입니다.대문자행이 있는 범퍼카 토토 이름이 행을 복제하는 경우도시. 그리고 그 중복 행은 기본적으로 다음의 쿼리에 표시됩니다.도시. 실제로 기본적으로대문자고유 제약조건이 없을 것입니다. 따라서 동일한 내용을 가진 여러 행이 포함될 수 있습니다. 이름. 고유 제약 조건을 추가할 수 있습니다.대문자, 그러나 이것이 방해가 되지는 않습니다. 중복과 비교도시.
마찬가지로 우리가 그것을 지정한다면도시.이름 참조다른 범퍼카 토토, 이것은 제약 조건이 자동으로 전파되지 않습니다.대문자. 이 경우에는 일할 수 있습니다. 수동으로 추가하여 주변에 동일한 내용을 추가합니다.참조다음으로 제한대문자.
다른 범퍼카 토토의 열을 지정참조 도시(이름)허용할 것입니다 다른 범퍼카 토토에는 도시 이름이 포함되지만 대문자 이름은 포함되지 않습니다. 이 경우에는 좋은 해결 방법이 없습니다.
이러한 결함은 아마도 미래에 수정될 것입니다 하지만 그 동안에는 상당한 주의가 필요합니다. 상속이 문제에 유용한지 여부를 결정합니다.
지원 중단됨:다음 릴리스에서포스트그레SQL7.1 이전에는 기본값 동작은 쿼리에 하위 범퍼카 토토을 포함하지 않는 것이었습니다. 이 오류가 발생하기 쉽고 규정을 위반하는 것으로 밝혀졌습니다. SQL 표준. 다음을 설정하면 7.1 이전 동작을 얻을 수 있습니다. 떨어져서sql_inheritance구성 옵션.