다음에서 조회수포스트그레스있습니다 토토 캔 시스템을 사용하여 구현되었습니다. 사실 전혀 없어요 a의 차이
SELECT * FROM mytab으로 myview 보기 생성;두 명령과 비교
테이블 생성 myview (mytab과 동일한 속성 목록);
대신 myview를 선택하려면 토토 캔 "_RETmyview"를 생성하세요.
SELECT * FROM mytab;이것이 바로 CREATE VIEW 명령이 하는 일이기 때문입니다
내부적으로. 여기에는 몇 가지 부작용이 있습니다. 그 중 하나는
뷰에 대한 정보는포스트그레시스템 카탈로그는 정확히 동일합니다
테이블과 마찬가지로. 따라서 쿼리 파서의 경우 절대적으로
테이블과 뷰 사이에는 차이가 없습니다. 그것들은 똑같습니다 -
관계. 지금은 그게 중요해요.토토 캔 ON SELECT는 마지막 단계로 모든 쿼리에 적용됩니다. 주어진 명령이 INSERT, UPDATE 또는 DELETE인 경우에도 마찬가지입니다. 그리고 그들은 수정한다는 점에서 다른 의미론과 다릅니다. 새로운 것을 생성하는 대신 파스트리를 제자리에 두십시오. 따라서 SELECT 토토 캔 먼저 설명합니다.
현재는 단 하나의 작업만 있을 수 있으며 이는 INSTEAD인 SELECT 작업입니다. 이 제한은 다음을 위해 필요했습니다. 일반 사용자에게도 공개할 수 있을 만큼 안전한 규칙을 만들고 ON SELECT 규칙을 실제 보기 규칙으로 제한합니다.
이 문서의 예는 일부 작업을 수행하는 두 개의 조인 뷰입니다. 계산과 이를 차례로 사용하는 더 많은 보기. 둘 중 하나 첫 번째 보기는 나중에 INSERT, UPDATE에 대한 규칙을 추가하여 사용자 정의됩니다. 최종 결과는 다음과 같은 뷰가 되도록 DELETE 작업을 수행합니다. 마법의 기능을 갖춘 실제 테이블처럼 작동합니다. 그렇지 않다 이렇게 간단한 예부터 시작하면 일이 더 어려워집니다. 들어가다. 하지만 모든 내용을 포괄하는 하나의 예를 갖는 것이 더 좋습니다. 여러 가지 이야기를 나누기보다는 차근차근 논의해 나가는 포인트 마음에 헷갈릴 수 있는 것.
예제를 재생하는데 필요한 데이터베이스 이름은 al_bundy입니다. 이것이 왜 데이터베이스 이름인지 곧 알게 될 것입니다. 그리고 그것은 필요합니다 절차적 언어 PL/pgSQL이 설치되었습니다. 약간의 필요가 있기 때문입니다. min() 함수는 2개의 정수 값 중 낮은 값을 반환합니다. 우리는 창조한다 그건
CREATE FUNCTION min(정수, 정수) 정수 AS를 반환합니다.
'시작
$1 < $2이면
$1를 반환합니다.
종료하면;
$2를 반환합니다.
끝;'
언어 'plpgsql';
처음 두 토토 캔 시스템에 필요한 실제 테이블 설명은 다음과 같습니다.
테이블 신발_데이터 생성(
shoename char(10), -- 기본 키
sh_avail 정수, -- 사용 가능한 쌍 수
slcolor char(10), -- 선호하는 신발끈 색상
slminlen float, -- 최소 신발끈 길이
slmaxlen float, -- 최대 신발끈 길이
slunit char(8) - 길이 단위
);
CREATE TABLE 신발끈_데이터(
sl_name char(10), -- 기본 키
sl_avail 정수, -- 사용 가능한 쌍 수
sl_color char(10), -- 신발끈 색상
sl_len float, -- 신발끈 길이
sl_unit char(8) -- 길이 단위
);
CREATE TABLE 단위(
un_name char(8), -- 기본 키
un_fact float -- cm로 변환할 인수
);내 생각에 우리 대부분은 신발을 신으며 이것이
정말 유용한 데이터. 세상에는 그런 신발이 있어요
신발끈은 필요하지 않지만 이것이 Al의 삶을 더 쉽게 만들고
그래서 우리는 그것을 무시합니다.보기는 다음과 같이 생성됩니다.
신발 AS 보기 만들기
sh.신발이름 선택,
sh.sh_avail,
sh.slcolor,
sh.slminlen,
sh.slminlen * un.un_fact AS slminlen_cm,
sh.slmaxlen,
sh.slmaxlen * un.un_fact AS slmaxlen_cm,
sh.slunit
shoe_data sh, 단위 un에서
sh.slunit = un.un_name;
신발끈 AS 보기 만들기
s.sl_name 선택,
s.sl_avail,
s.sl_color,
s.sl_len,
s.sl_유닛,
s.sl_len * u.un_fact AS sl_len_cm
신발끈_데이터 s, 단위 u에서
s.sl_unit = u.un_name;
shoe_ready AS 보기 만들기
rsh.신발이름 선택,
rsh.sh_avail,
rsl.sl_이름,
rsl.sl_avail,
min(rsh.sh_avail, rsl.sl_avail) AS total_avail
FROM 신발 rsh, 신발끈 rsl
여기서 rsl.sl_color = rsh.slcolor
그리고 rsl.sl_len_cm = rsh.slminlen_cm
그리고 rsl.sl_len_cm <= rsh.slmaxlen_cm;다음에 대한 CREATE VIEW 명령신발끈보기(가장 간단한 보기)
관계 신발끈과 항목을 생성합니다.pg_rewrite재작성 규칙이 있음을 알려줍니다.
신발끈 관계가 참조될 때마다 적용되어야 하는 것입니다.
쿼리 범위 테이블에서. 규칙에 규칙 자격이 없습니다.
(현재 SELECT 규칙은 SELECT가 아닌 규칙에서 논의됩니다.
가질 수 없음) INSTEAD입니다. 규칙 자격에 유의하세요.
쿼리 자격과 동일하지 않습니다! 규칙 작업에는
자격.규칙 작업은 다음의 정확한 복사본인 하나의 쿼리 트리입니다. 뷰 생성 명령의 SELECT 문입니다.
이제 우리는 채웁니다단위, 신발_데이터그리고신발끈_데이터그리고 Al은 그의 첫 번째 SELECT를 입력합니다. 생활:참고:NEW 및 OLD에 대한 두 개의 추가 범위 테이블 항목 (인쇄본에서는 역사적 이유로 *NEW* 및 *CURRENT*로 명명됨) 쿼리트리)에서 볼 수 있습니다.pg_rewrite항목이 SELECT에 관심이 없습니다. 토토 캔.
al_bundy= INSERT INTO 단위 VALUES('cm', 1.0);
al_bundy= 단위 VALUES('m', 100.0)에 삽입;
al_bundy= 단위 값에 삽입('인치', 2.54);
al_bundy=
al_bundy= shoe_data 값에 삽입
al_bundy- ('sh1', 2, '검은색', 70.0, 90.0, 'cm');
al_bundy= shoe_data 값에 삽입
al_bundy- ('sh2', 0, '검은색', 30.0, 40.0, '인치');
al_bundy= shoe_data 값에 삽입
al_bundy- ('sh3', 4, '갈색', 50.0, 65.0, 'cm');
al_bundy= shoe_data 값에 삽입
al_bundy- ('sh4', 3, '갈색', 40.0, 50.0, '인치');
al_bundy=
al_bundy= 신발끈_데이터 값에 삽입
al_bundy- ('sl1', 5, '검정색', 80.0, 'cm');
al_bundy= 신발끈_데이터 값에 삽입
al_bundy- ('sl2', 6, '검정색', 100.0, 'cm');
al_bundy= 신발끈_데이터 값에 삽입
al_bundy- ('sl3', 0, '검은색', 35.0 , '인치');
al_bundy= 신발끈_데이터 값에 삽입
al_bundy- ('sl4', 8, '검은색', 40.0 , '인치');
al_bundy= 신발끈_데이터 값에 삽입
al_bundy- ('sl5', 4, '갈색', 1.0 , 'm');
al_bundy= 신발끈_데이터 값에 삽입
al_bundy- ('sl6', 0, '갈색', 0.9 , 'm');
al_bundy= 신발끈_데이터 값에 삽입
al_bundy- ('sl7', 7, '갈색', 60 , 'cm');
al_bundy= 신발끈_데이터 값에 삽입
al_bundy- ('sl8', 1, '갈색', 40 , '인치');
al_bundy=
al_bundy= SELECT * 신발끈에서;
sl_name |sl_avail|sl_color |sl_len|sl_unit |sl_len_cm
----------+---------+----------+------+---------+---------
sl1 | 5|검은색 | 80|cm | 80
sl2 | 6|검은색 | 100|cm | 100
sl7 | 7|갈색 | 60|cm | 60
sl3 | 0|검은색 | 35|인치 | 88.9
sl4 | 8|검은색 | 40|인치 | 101.6
sl8 | 1|갈색 | 40|인치 | 101.6
sl5 | 4|갈색 | 1|분 | 100
sl6 | 0|갈색 | 0.9|분 | 90
(8행)이것이 우리의 뷰에 대해 할 수 있는 가장 간단한 SELECT Al이므로 우리는
이것은 보기 규칙의 기본을 설명하기 위한 것입니다. 'SELECT * FROM
신발끈'은 파서에 의해 해석되어 파싱 트리를 생성했습니다.SELECT 신발끈.sl_name, 신발끈.sl_avail,
신발끈.sl_color, 신발끈.sl_len,
신발끈.sl_unit, 신발끈.sl_len_cm
신발끈 신발끈에서;그리고 이것은 토토 캔 시스템에 제공됩니다. 룰 시스템 워크
범위 테이블을 통해 규칙이 있는지 확인합니다.pg_rewrite모든 관계에 대해. 처리할 때
에 대한 범위 테이블 항목신발끈(유일한
지금까지 하나) 구문 분석 트리를 사용하여 '_RETshoelace' 토토 캔을 찾습니다.
s.sl_name, s.sl_avail 선택,
s.sl_color, s.sl_len, s.sl_unit,
float8mul(s.sl_len, u.un_fact) AS sl_len_cm
FROM 신발끈 *OLD*, 신발끈 *NEW*,
신발끈_데이터 s, 단위 u
WHERE bpchareq(s.sl_unit, u.un_name);
파서가 계산을 변경했으며
적절한 기능에 대한 호출로 자격을 부여합니다. 하지만 사실
이것은 아무것도 바꾸지 않습니다. 재작성의 첫 번째 단계는
두 개의 범위 테이블. 결과 구문 분석 트리는 다음을 읽습니다.SELECT 신발끈.sl_name, 신발끈.sl_avail,
신발끈.sl_color, 신발끈.sl_len,
신발끈.sl_unit, 신발끈.sl_len_cm
신발끈 신발끈에서,신발끈 *OLD*,
신발끈 *신규*, 신발끈_데이터 s,
단위 u;
2단계에서는 규칙 작업의 제한을 다음에 추가합니다.
결과적으로 구문 분석 트리SELECT 신발끈.sl_name, 신발끈.sl_avail,
신발끈.sl_color, 신발끈.sl_len,
신발끈.sl_unit, 신발끈.sl_len_cm
신발끈 신발끈, 신발끈 *OLD*,
신발끈 *NEW*, 신발끈_데이터 s,
단위 ubpchareq(s.sl_unit, u.un_name)은 어디에 있나요?;
그리고 3단계에서는 구문 분석 트리의 모든 변수를 대체합니다.
rangetable 항목을 참조하는 항목(다음에 대한 항목)신발끈현재 처리 중)
규칙 작업의 해당 대상 목록 표현식입니다. 이
최종 쿼리 결과선택s.sl_name, s.sl_avail,
s.sl_color, s.sl_len,
s.sl_unit, float8mul(s.sl_len, u.un_fact)AS sl_len_cm
신발끈 신발끈, 신발끈 *OLD*,
신발끈 *NEW*, 신발끈_데이터 s,
단위 너
WHERE bpchareq(s.sl_unit, u.un_name);이것을 현실로 되돌리는 중SQL인간 사용자가 입력할 내용 읽기SELECT s.sl_name, s.sl_avail,
s.sl_color, s.sl_len,
s.sl_unit, s.sl_len * u.un_fact AS sl_len_cm
신발끈_데이터 s, 단위 u에서
s.sl_unit = u.un_name;이것이 첫 번째로 적용된 규칙이었습니다. 이 작업이 수행되는 동안,
레인지 테이블이 커졌습니다. 따라서 토토 캔 시스템은 계속해서
범위 테이블 항목. 다음은 2번(신발끈 *OLD*)입니다.
관계신발끈규칙이 있는데 이건
rangetable 항목은 다음 변수에서 참조되지 않습니다.
파스트리이므로 무시됩니다. 나머지 모든 범위 테이블은
항목에 규칙이 없습니다.pg_rewrite또는 참조되지 않았거나 끝에 도달했습니다.
범위 테이블의. 재작성이 완료되어 위 내용이 최종본입니다
결과는 옵티마이저에 제공됩니다. 최적화 프로그램은 추가 항목을 무시합니다.
변수에 의해 참조되지 않는 범위 테이블 항목
파스트리와 플래너/옵티마이저가 생성한 계획은 다음과 같습니다.
Al이 위의 SELECT 쿼리를 대신 입력한 것과 똑같습니다.
보기 선택 중.이제 우리는 블루스 브라더스가 등장한다는 문제로 알과 마주하게 됩니다. 그의 가게에서 새 신발을 사고 싶어하고 블루스로서 형제들은 같은 신발을 신고 싶어합니다. 그리고 그들은 원한다 바로 신으려면 신발끈도 필요해요.
Al은 현재 매장에 어떤 신발이 있는지 알아야 합니다. 일치하는 신발끈(색상 및 크기) 및 총 개수 정확히 일치하는 쌍의 수는 2보다 크거나 같습니다. 우리는 그를 가르친다 어떻게 해야 하는지 그리고 그는 그의 데이터베이스에 질문합니다:
al_bundy= SELECT * FROM shoe_ready WHERE total_avail = 2;
신발 이름 |sh_avail|sl_name |sl_avail|total_avail
---------+---------+----------+---------+-----------
sh1 | 2|sl1 | 5| 2
sh3 | 4|sl7 | 7| 4
(2행)Al은 신발 전문가이므로 그는 sh1 유형의 신발만
맞을 것 같아요(신발끈 sl7은 갈색이고 신발은 갈색이 필요해요)
신발끈은 블루스 브라더스가 신는 신발이 아닙니다.이번 파서의 출력은 파서 트리입니다.
SELECT shoe_ready.shoename, shoe_ready.sh_avail,
shoe_ready.sl_name, shoe_ready.sl_avail,
shoe_ready.total_avail
신발 준비 신발 준비에서
어디 int4ge(shoe_ready.total_avail, 2);적용되는 첫 번째 규칙은 다음에 대한 규칙이 될 것입니다.shoe_ready관계로 인해 파싱 트리가 생성됩니다.선택rsh.shoename, rsh.sh_avail,
rsl.sl_name, rsl.sl_avail,
min(rsh.sh_avail, rsl.sl_avail) AS total_availshoe_ready shoe_ready에서,shoe_ready *오래된*,
shoe_ready *NEW*, 신발 rsh,
신발끈 rsl어디에서 int4ge(분(rsh.sh_avail, rsl.sl_avail), 2)
AND (bpchareq(rsl.sl_color, rsh.slcolor)
그리고 float8ge(rsl.sl_len_cm, rsh.slminlen_cm)
그리고 float8le(rsl.sl_len_cm, rsh.slmaxlen_cm)
);
실제로 제한의 AND 절은 다음과 같습니다.
왼쪽 및 오른쪽 표현식이 있는 AND 유형의 연산자 노드입니다. 하지만
그러면 이미 그랬기 때문에 읽기가 더 어려워지고 더 많은 것이 있습니다.
적용할 규칙. 그래서 나는 그것들을 그룹화하기 위해 일부 괄호 안에 넣었습니다.
추가된 순서대로 논리 단위로 분류하고
관계 규칙을 계속 유지신발이것은 참조되고 다음을 갖는 다음 범위 테이블 항목이기 때문입니다.
규칙. 적용한 결과는 다음과 같습니다선택sh.shoename, sh.sh_avail,
rsl.sl_name, rsl.sl_avail,
분(sh.sh_avail, rsl.sl_avail) AS total_avail,
FROM shoe_ready shoe_ready, shoe_ready *OLD*,
shoe_ready *NEW*, 신발 rsh,
신발끈 rsl,신발 *오래된*,
신발 *새 상품*, shoe_data sh,
단위 유엔어디에서 (int4ge(min(sh.sh_avail, rsl.sl_avail), 2)
AND (bpchareq(rsl.sl_color,sh.slcolor)
그리고 float8ge(rsl.sl_len_cm,float8mul(sh.slminlen, un.un_fact))
그리고 float8le(rsl.sl_len_cm,float8mul(sh.slmaxlen, un.un_fact))
)
)
AND bpchareq(sh.slunit, un.un_name);
그리고 마지막으로 우리는 이미 잘 알려진 규칙을 적용합니다.신발끈(이번에는 구문 분석 트리에서
조금 더 복잡합니다) 그리고 getSELECT sh.shoename, sh.sh_avail,s.sl_name, s.sl_avail,
분(sh.sh_avail,s.sl_avail) AS total_avail
FROM shoe_ready shoe_ready, shoe_ready *OLD*,
shoe_ready *NEW*, 신발 rsh,
신발끈 rsl, 신발 *OLD*,
신발 *NEW*, shoe_data sh,
단위 유엔,신발끈 *OLD*,
신발끈 *신규*, 신발끈_데이터 s,
단위 u어디에서 ( (int4ge(min(sh.sh_avail,s.sl_avail), 2)
그리고 (bpchareq(s.sl_color, sh.slcolor)
그리고 float8ge(float8mul(s.sl_len, u.un_fact),
float8mul(sh.slminlen, un.un_fact))
그리고 float8le(float8mul(s.sl_len, u.un_fact),
float8mul(sh.slmaxlen, un.un_fact))
)
)
AND bpchareq(sh.slunit, un.un_name)
)AND bpchareq(s.sl_unit, u.un_name);
다시 우리는 그것을 현실로 줄입니다SQL토토 캔의 최종 출력에 해당하는 문
시스템:SELECT sh.shoename, sh.sh_avail,
s.sl_name, s.sl_avail,
min(sh.sh_avail, s.sl_avail) AS total_avail
FROM shoe_data sh, shoelace_data s, 유닛 u, 유닛 un
WHERE min(sh.sh_avail, s.sl_avail) = 2
그리고 s.sl_color = sh.slcolor
AND s.sl_len * u.un_fact = sh.slminlen * un.un_fact
AND s.sl_len * u.un_fact <= sh.slmaxlen * un.un_fact
AND sh.sl_unit = un.un_name
AND s.sl_unit = u.un_name;토토 캔의 재귀적 처리로 인해 보기에서 하나의 SELECT가 다시 작성되었습니다.
이는 Al이 해야 했던 것과 정확히 동일합니다.
조회수가 전혀 없을 경우 입력하세요.참고:현재 재귀 중지가 없습니다. 토토 캔 시스템의 보기 규칙 메커니즘(다른 시스템에만 해당) 규칙). 별로 아프지 않습니다. 왜냐하면 이것을 밀어붙이는 유일한 방법이기 때문입니다. 무한 루프에 빠집니다(백엔드가 메모리 제한)은 테이블을 생성한 다음 보기 규칙을 설정하는 것입니다. CREATE RULE을 직접 사용하여 다음 중에서 선택합니다. 그 중 하나를 선택하는 다른 것. 이런 일은 절대 일어날 수 없다. CREATE VIEW는 첫 번째 CREATE VIEW에서 두 번째 CREATE VIEW가 사용되기 때문에 사용됩니다. 관계가 존재하지 않으므로 첫 번째 보기에서 선택할 수 없습니다. 두 번째부터요.
분석 트리의 두 가지 세부 사항은 설명에서 건드리지 않았습니다. 위의 보기 규칙. 이는 명령 유형과 결과 관계. 실제로 뷰 규칙에는 이러한 항목이 필요하지 않습니다. 정보.
분석 트리 사이에는 단지 몇 가지 차이점이 있습니다. SELECT와 다른 명령에 대한 것입니다. 분명히 그들은 또 다른 commandtype과 이번에는 resultrelation이 다음을 가리킵니다. 결과가 이동해야 하는 범위 테이블 항목입니다. 다른 건 다 절대적으로 동일합니다. 따라서 속성이 있는 두 개의 테이블 t1과 t2가 있습니다. a와 b, 두 명령문에 대한 구문 분석 트리
t1.a = t2.a인 경우 t1, t2에서 t2.b를 선택합니다.
업데이트 t1 SET b = t2.b WHERE t1.a = t2.a;거의 동일합니다.범위 테이블에는 테이블 t1 및 t2.
대상 목록에는 다음을 가리키는 하나의 변수가 포함되어 있습니다. 테이블 t2에 대한 범위 테이블 항목의 속성 b.
한정식은 다음의 속성을 비교합니다 두 범위 모두 동일합니다.
t1 세트 업데이트 a = t1.a, b = t2.b WHERE t1.a = t2.a;따라서 조인을 실행하는 실행자는 정확히 다음을 생성합니다. a와 동일한 결과 세트
t1.a = t2.a인 경우 t1, t2에서 t1.a, t2.b를 선택하세요.그렇습니다. 그런데 UPDATE에 약간의 문제가 있습니다. 는 실행자는 자신이 수행하는 조인의 결과가 무엇인지 신경 쓰지 않습니다. 을 의미합니다. 단지 행의 결과 집합을 생성합니다. 는 하나는 SELECT 명령이고 다른 하나는 UPDATE라는 차이점이 있습니다. 실행자의 호출자에서 처리됩니다. 발신자는 아직 알고 있어요 (파싱 트리를 보면서) 이것이 업데이트이고 그는 알고 있습니다. 이 결과는 테이블 t1에 들어가야 합니다. 하지만 666개의 행 중 어느 것이 새 행으로 교체해야 합니까? 실행된 계획 잠재적으로 다음을 생성할 수 있는 자격을 갖춘 조인입니다. 순서를 알 수 없는 0에서 666 사이의 행 수입니다.
이 문제를 해결하기 위해 다른 항목이 UPDATE 및 DELETE 문의 대상 목록. 현재 튜플 ID (ctid). 이것은 특별한 기능을 가진 시스템 속성입니다. 그것 행에 대한 블록과 블록의 위치를 포함합니다. 아는 것 테이블에서 ctid는 1.5GB에서 하나의 특정 행을 찾는 데 사용될 수 있습니다. 하나의 데이터를 가져와서 수백만 개의 행을 포함하는 크기의 테이블 블록. targetlist에 ctid를 추가한 후 최종 결과 세트는 다음과 같이 정의될 수 있습니다.
t1.a = t2.a인 경우 t1, t2에서 t1.a, t2.b, t1.ctid를 선택하세요.이제 또 다른 세부사항포스트그레스무대에 들어갑니다. 지금 이 순간, 테이블 행은 덮어쓰지 않으므로 ABORT TRANSACTION이 빨리. UPDATE에서는 새 결과 행이 테이블에 삽입됩니다. (ctid를 제거한 후) 및 ctid가 있는 행의 튜플 헤더에 cmax를 가리키고 xmax 항목은 현재 명령으로 설정됩니다. 카운터 및 현재 거래 ID. 따라서 이전 행은 숨겨지고 트랜잭션이 커밋된 후 진공청소기가 실제로 움직일 수 있습니다. 밖으로.
이 모든 것을 알고 있으면 우리는 보기 토토 캔을 절대적으로 간단히 적용할 수 있습니다. 어떤 명령에도 마찬가지입니다. 차이가 없습니다.
위는 토토 캔 시스템이 보기를 통합하는 방법을 보여줍니다. 원래 구문 분석 트리에 정의합니다. 두 번째 예에서는 한 뷰에서 간단한 SELECT를 수행하면 최종 구문 분석 트리가 생성됩니다. 4개 테이블의 조인(단위는 다른 이름으로 두 번 사용됨).
토토 캔 시스템으로 보기를 구현하면 다음과 같은 이점이 있습니다. 옵티마이저는 어떤 테이블이 있어야 하는지에 대한 모든 정보를 가지고 있습니다. 스캔된 내용과 이러한 테이블 간의 관계, 관점과 자격의 제한적 자격 하나의 단일 구문 분석 트리에 있는 원래 쿼리에서 가져옵니다. 그리고 이것은 아직도 원래 쿼리가 이미 뷰에 대한 조인인 경우입니다. 이제 최적화 프로그램은 실행하기에 가장 좋은 경로를 결정해야 합니다. 쿼리. 옵티마이저에 더 많은 정보가 있을수록 더 좋습니다. 결정이 될 수 있습니다. 그리고 구현된 토토 캔 시스템은포스트그레이것이 모든 정보임을 보장합니다 지금까지의 쿼리에 대해 확인 가능합니다.
오랫동안 그곳에서포스트그레스토토 캔 시스템이 손상된 것으로 간주되었습니다. 규칙의 사용은 권장되지 않았으며 작동하는 유일한 부분은 다음과 같습니다. 규칙을 봅니다. 또한 이러한 뷰 규칙은 문제를 야기했습니다. 토토 캔 시스템이 다른 명령문에 이를 적절하게 적용할 수 없었습니다. SELECT보다(예: 뷰의 데이터를 사용한 UPDATE) 작동하지 않았습니다.)
그 기간 동안 개발이 진행되었으며 많은 기능이 추가되었습니다. 파서 및 최적화 프로그램에 추가되었습니다. 토토 캔 시스템이 더 많아졌습니다. 그들의 능력과 점점 더 동기화되지 않고 더 어려워졌습니다. 고치기 시작하기가 더 어렵습니다. 그래서 아무도 그러지 않았어.
6.4에서는 누군가 문을 잠그고 깊은 숨을 쉬더니 그 빌어먹을 걸 뒤섞어버렸어. 나온 것은 토토 캔 시스템이었습니다. 이 문서에 설명된 기능. 하지만 아직은 일부 구성은 처리되지 않고 일부는 문제로 인해 실패합니다. 현재는 지원되지 않습니다.포스트그레쿼리 최적화 도구.
집계 열이 있는 보기에 잘못된 문제가 있습니다. 집계 제한의 표현식은 하위 선택에서 사용해야 합니다. 현재는 두 개의 뷰를 결합하는 것이 불가능합니다. 집계 열이 있고 두 집계를 비교합니다. 자격의 가치. 그 동안에는 다음이 가능합니다. 이러한 집계 표현식을 다음과 같은 함수에 넣습니다. 적절한 인수를 선택하고 뷰 정의에 사용하세요.
Union의 보기는 현재 지원되지 않습니다. 글쎄요 쉽죠 간단한 SELECT를 공용체로 다시 작성합니다. 하지만 조금이다 뷰가 업데이트를 수행하는 조인의 일부인 경우 어렵습니다.
뷰 정의의 ORDER BY 절은 지원되지 않습니다.
DISTINCT는 보기 정의에서 지원되지 않습니다.
설명된 토토 캔 시스템을 사용하여 뷰를 구현하는 것은 재미있습니다. 부작용. 다음은 작동하지 않는 것 같습니다.
al_bundy= 신발에 삽입(shoename, sh_avail, slcolor)
al_bundy- VALUES ('sh5', 0, '검정색');
삽입 20128 1
al_bundy= shoe_data에서 신발 이름, sh_avail, slcolor 선택;
신발이름 |sh_avail|slcolor
--------+---------+----------
sh1 | 2|검은색
sh3 | 4|갈색
sh2 | 0|검은색
sh4 | 3|갈색
(4행)흥미로운 점은 INSERT에 대한 반환 코드가
객체 ID를 알려주고 1개의 행이 삽입되었음을 알려줍니다. 하지만 그것은
에는 나타나지 않습니다.신발_데이터. 조사하다
우리가 볼 수 있는 데이터베이스 디렉터리, 해당 데이터베이스 파일은
관계 보기신발지금은
데이터 블록. 그리고 그것은 확실히 사실입니다.우리는 DELETE를 실행할 수도 있으며, 만약 DELETE가 없다면 한정하면 행이 삭제되었고 다음 행이 삭제되었음을 알려줍니다. 진공 실행은 파일을 0 크기로 재설정합니다.
그 행동의 이유는, INSERT는 다음을 참조하지 않습니다.신발모든 변수의 관계. 대상 목록에는 상수만 포함되어 있습니다. 가치. 그래서 적용할 토토 캔이 없고 그대로 내려갑니다. 실행에 들어가고 행이 삽입됩니다. DELETE도 마찬가지입니다.
이를 변경하기 위해 우리는 다음의 행동을 수정하는 규칙을 정의할 수 있습니다 SELECT가 아닌 쿼리. 이것이 다음 섹션의 주제입니다.