| 토토 9.2.24 문서 | ||||
|---|---|---|---|---|
| 스포츠 토토 베트맨 PostgreSQL : 문서 : 9.2 : Schemas | 스포츠 토토 : 문서 : 9.2 : 데이터 정의 | 제5장. 데이터 정의 | PostgreSQL : 문서 : 9.2 : 윈 토토 | |
포스트그레SQL테이블 구현 토토은 데이터베이스 디자이너에게 유용한 도구가 될 수 있습니다. (SQL:1999 이상에서는 유형 토토 기능을 정의합니다. 여기에 설명된 기능과 여러 측면에서 다릅니다.)
예를 들어 시작해 보겠습니다. 우리가 도시를 위한 데이터 모델. 각 주에는 여러 개의 도시가 있지만 단 하나의 도시만 있습니다. 자본. 우리는 수도를 빠르게 되찾고 싶습니다. 특정 주에 대해. 이는 두 개를 생성하여 수행할 수 있습니다. 테이블 중 하나는 주의 수도용이고 다른 하나는 주도가 아닌 도시용입니다. 수도. 하지만 데이터를 요청하면 어떻게 되나요? 수도인지 아닌지에 관계없이 도시에 대해? 는 토토 기능은 이 문제를 해결하는 데 도움이 될 수 있습니다. 우리는 정의합니다대문자테이블이 다음에서 토토됨도시:
테이블 도시 생성(
이름 텍스트,
인구 부동,
고도 int - 피트 단위
);
CREATE TABLE 대문자(
상태 문자(2)
) 토토(도시);
이 경우,대문자테이블토토상위 항목의 모든 열 테이블,도시. 주 수도 또한 추가 열이 있습니다.상태그건 상태를 보여줍니다.
에포스트그레SQL, 테이블은 다음을 수행할 수 있습니다. 0개 이상의 다른 테이블에서 토토되며 쿼리는 참조할 수 있습니다. 테이블의 모든 행 또는 테이블의 모든 행과 해당 테이블의 모든 행 하위 테이블. 후자의 동작이 기본값입니다. 에 대한 예를 들어, 다음 쿼리는 모든 도시의 이름을 찾습니다. 이상의 고도에 위치한 주도를 포함하여 500피트:
SELECT 이름, 고도
도시에서
고도 500;
다음의 샘플 데이터가 제공됩니다.토토튜토리얼(참조섹션 2.1), 이는 다음을 반환합니다.
이름 | 고도 ---------+---------- 라스베가스 | 2174 마리포사 | 1953년 매디슨 | 845
반면에 다음 쿼리는 모든 도시를 찾습니다. 주도가 아니고 고도가 높은 곳에 위치한 곳 500피트:
SELECT 이름, 고도
도시에서만
고도 500인 곳;
이름 | 고도
---------+----------
라스베가스 | 2174
마리포사 | 1953
여기는만키워드는 다음을 나타냅니다. 쿼리는 다음에만 적용되어야 합니다.도시, 아래 테이블은 제외도시토토 계층에서. 많은 우리가 이미 논의한 명령 —선택, 업데이트그리고삭제— 지원만키워드.
또한 테이블 이름을 뒤에 붙여 쓸 수 있습니다.*하위 테이블이 다음과 같이 명시적으로 지정됩니다. 포함됨:
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, '뉴욕');
우리는 데이터가 어떻게든 다음으로 라우팅되기를 바랄 수 있습니다.대문자테이블이지만 이것은 그렇지 않습니다. 발생:삽입항상 삽입 정확히 지정된 테이블입니다. 어떤 경우에는 다음이 가능합니다. 규칙을 사용하여 삽입을 리디렉션합니다(참조37장). 그러나 그것은 에 도움이 되지 않습니다 위의 경우는 다음과 같습니다.도시테이블 열을 포함하지 않습니다.상태, 따라서 규칙이 적용되기 전에 명령이 거부됩니다. 적용되었습니다.
상위 항목에 대한 모든 검사 제약 조건 및 null이 아닌 제약 조건 테이블은 해당 자식에게 자동으로 토토됩니다. 다른 유형 제약 조건(고유 키, 기본 키, 외래 키 제약 조건) 토토되지 않습니다.
테이블은 하나 이상의 상위 테이블에서 토토될 수 있습니다. 상위 항목에 의해 정의된 열의 합집합이 있는 경우 테이블. 하위 테이블 정의에 선언된 모든 열은 다음과 같습니다. 이것들에 추가되었습니다. 동일한 컬럼명이 여러개 나타나는 경우 상위 테이블 또는 상위 테이블과 하위 테이블 모두 정의하면 이 열은"병합"따라서 다음에는 그러한 열이 하나만 있습니다. 아이 테이블. 병합하려면 열에 동일한 데이터가 있어야 합니다. 유형을 지정하지 않으면 오류가 발생합니다. 병합된 열에는 다음 중 하나에서 오는 모든 검사 제약 조건의 복사본 해당 열 정의는 null이 아닌 것으로 표시됩니다. 그 중 하나입니다.
테이블 토토은 일반적으로 하위 항목이 테이블은 다음을 사용하여 생성됩니다.토토의 절PostgreSQL : 문서 : 9.2 : 무지개 토토 작성성명. 또는 이미 정의된 테이블 호환 가능한 방식으로 다음을 사용하여 새로운 상위 관계를 추가할 수 있습니다.토토변형테이블 변경. 그러기 위해서는 새로운 아이가 테이블에는 이름과 유형이 동일한 열이 이미 포함되어 있어야 합니다. 부모의 열로. 수표도 포함해야 함 동일한 이름과 검사 표현식을 가진 제약 조건 부모. 마찬가지로 토토 링크도 다음에서 제거될 수 있습니다. 어린이는토토 없음변형테이블 변경. 동적으로 추가하고 이와 같은 토토 링크를 제거하는 것은 다음과 같은 경우에 유용할 수 있습니다. 테이블 파티셔닝에 토토 관계가 사용되고 있습니다. (참조PostgreSQL : 문서 : 9.2 : 윈 토토).
호환되는 테이블을 생성하는 편리한 방법 중 하나는 다음과 같습니다. 나중에 새로운 자식을 만들려면좋아요절만들기 표. 그러면 다음과 동일한 열이 포함된 새 테이블이 생성됩니다. 소스 테이블. 있다면확인소스 테이블에 정의된 제약 조건,제약조건 포함옵션좋아요새 하위 항목이 다음과 같이 지정되어야 합니다. 고려할 상위 항목과 일치하는 제약 조건이 있음 호환됩니다.
상위 테이블은 하위 테이블이 있는 동안 삭제할 수 없습니다. 남아있다. 하위 테이블의 열이나 제약 조건을 확인할 수 없습니다. 부모로부터 토토된 경우 삭제되거나 변경됩니다. 테이블. 테이블과 그 하위 항목을 모두 제거하려면 다음을 수행하십시오. 한 가지 쉬운 방법은를 사용하여 상위 테이블을 삭제하는 것입니다.캐스케이드옵션.
스포츠 토토 베트맨 PostgreSQL : 문서 : 9.2 : Alter Table전파됩니다 열 데이터 정의의 변경 사항 및 제약 조건 확인 토토 계층. 다시 한 번 다음과 같은 열을 삭제합니다. 다른 테이블에 의존하는 것은를 사용할 때만 가능합니다.캐스케이드옵션.테이블 변경중복에 대해서도 동일한 규칙을 따릅니다. 동안 적용되는 열 병합 및 거부테이블 생성.
테이블 액세스 권한이 어떻게 처리되는지 참고하세요. 쿼리 중 상위 테이블은 자동으로 하위 테이블의 데이터에 액세스할 수 있습니다. 추가 액세스 권한 확인 없이. 이는 데이터가 상위 테이블에도 있는 것처럼 보입니다. 접근 중 그러나 하위 테이블은 직접적으로 허용되지 않습니다. 부여하려면 추가 권한이 필요합니다.
모든 SQL 명령이 작동할 수 있는 것은 아닙니다. 토토 계층. 데이터에 사용되는 명령 쿼리, 데이터 수정 또는 스키마 수정(예:선택, 업데이트, 삭제, 대부분 의 변형테이블 변경하지만 아님삽입또는변경 테이블 ... 이름 바꾸기) 일반적으로 기본적으로 하위 항목을 포함합니다. 테이블을 지원하고만표기법 그들을 제외합니다. 데이터베이스 유지 관리를 수행하는 명령 및 튜닝(예:REINDEX, 진공)는 일반적으로 개인에게만 작동합니다. 물리적 테이블이며 토토에 대한 반복을 지원하지 않습니다. 계층. 각 개별 명령의 해당 동작 참조 페이지()에 설명되어 있습니다.참조 I,SQL 명령).
토토 기능의 심각한 제한은 다음과 같습니다. 인덱스(고유 제약 조건 포함) 및 외래 키 제약 조건은 단일 테이블에만 적용되며 해당 테이블에는 적용되지 않습니다. 토토 자녀. 이는 참조 및 참조 모두에 해당됩니다. 외래 키 제약 조건의 참조 측면. 따라서, 위 예의 조건:
우리가 선언했다면도시.이름되다고유또는 a기본 키, 이것은 멈추지 않을 것입니다.대문자행이 있는 테이블 이름이 행을 복제하는 경우도시. 그리고 그 중복 행은 기본적으로 다음의 쿼리에 표시됩니다.도시. 실제로 기본적으로대문자고유 제약조건이 없습니다. 따라서 동일한 내용을 가진 여러 행이 포함될 수 있습니다. 이름. 고유 제약 조건을 추가할 수 있습니다.대문자, 하지만 이것이 방해가 되지는 않습니다. 중복과 비교도시.
마찬가지로 우리가 그것을 지정한다면도시.이름 참조다른 테이블, 이것은 제약 조건이 자동으로 전파되지 않습니다.대문자. 이 경우에는 일할 수 있습니다. 수동으로 추가하여 주변에 동일한 내용을 추가합니다.참조다음으로 제한대문자.
다른 테이블의 열을 지정참조 도시(이름)허용할 것입니다 다른 테이블에는 도시 이름이 포함되지만 대문자 이름은 포함되지 않습니다. 이 경우에는 좋은 해결 방법이 없습니다.
이러한 결함은 아마도 미래에 수정될 것입니다 하지만 그 동안에는 상당한 주의가 필요합니다. 토토이 귀하에게 유용한지 여부를 결정합니다. 신청합니다.