삽입, 업데이트및삭제다음에 정의된 규칙삽입, 업데이트및삭제이전 섹션에서 설명한 보기 규칙과 크게 다릅니다. 첫째, 그들의토토 사이트 순위 생성명령은 더 많은 것을 허용합니다:
그들은 아무런 조치도 취할 수 없습니다.
그들은 여러 가지 활동을 할 수 있습니다.
그들은 그럴 수 있습니다대신또는또한(기본값).
의사관계신규그리고오래된유용해집니다.
그들은 토토 사이트 순위 제한을 가질 수 있습니다.
둘째, 그들은 쿼리 트리를 제자리에서 수정하지 않습니다. 대신 0개 이상의 새 쿼리 트리를 만들고 원래 쿼리 트리를 버릴 수 있습니다.
많은 경우 토토 사이트 순위에 의해 수행될 수 있는 작업삽입/업데이트/삭제트리거를 사용하는 것이 더 좋습니다. 트리거는 표기법상 조금 더 복잡하지만 의미는 이해하기가 훨씬 간단합니다. 토토 사이트 순위은 원래 쿼리에 일시적인 함수가 포함되어 있으면 놀라운 결과를 가져오는 경향이 있습니다. 즉, 토토 사이트 순위을 수행하는 과정에서 일시적인 함수가 예상보다 더 많이 실행될 수 있습니다.
또한 이러한 유형의 규칙이 전혀 지원하지 않는 경우가 있습니다. 특히 다음과 같습니다.위드원래 쿼리의 절 및 다중 할당 하위-선택s inSET목록업데이트쿼리. 이는 이러한 구성을 토토 사이트 순위 쿼리에 복사하면 쿼리 작성자의 명시적인 의도와는 반대로 하위 쿼리가 여러 번 평가되기 때문입니다.
구문을 유지하십시오:
토토 사이트 순위 생성 [ 또는 교체 ]이름AS ON이벤트받는 사람테이블[어디에서조건] 하세요 [ 또한 | 대신 ] 아무것도 |명령| (명령;명령... ) }
생각해 보세요. 다음에서,업데이트 규칙다음에 정의된 규칙을 의미합니다.삽입, 업데이트또는삭제.
업데이트 규칙은 쿼리 트리의 결과 관계와 명령 유형이 주어진 개체 및 이벤트와 같을 때 규칙 시스템에 의해 적용됩니다.토토 사이트 순위 생성명령. 업데이트 규칙의 경우 규칙 시스템은 쿼리 트리 목록을 생성합니다. 처음에는 쿼리 트리 목록이 비어 있습니다. 0이 있을 수 있습니다(아무것도 없음키워드), 하나 또는 여러 작업. 단순화하기 위해 하나의 작업이 포함된 규칙을 살펴보겠습니다. 이 규칙은 자격을 갖거나 갖지 않을 수 있으며 다음과 같습니다.대신또는또한(기본값).
토토 사이트 순위 제한이란 무엇입니까? 토토 사이트 순위의 작업을 언제 수행해야 하는지, 언제 수행하지 말아야 하는지를 알려주는 제한 사항입니다. 이 자격은 의사 관계만 참조할 수 있습니다.신규및/또는오래된, 이는 기본적으로 객체로 제공된 관계를 나타냅니다(그러나 특별한 의미가 있음).
따라서 단일 작업 규칙에 대해 다음 쿼리 트리를 생성하는 세 가지 경우가 있습니다.
또한또는대신원래 쿼리 트리의 자격이 추가된 토토 사이트 순위 작업의 쿼리 트리
또한토토 사이트 순위 제한과 원래 쿼리 트리의 제한이 추가된 토토 사이트 순위 작업의 쿼리 트리
대신토토 사이트 순위 자격 및 원래 쿼리 트리의 자격이 있는 토토 사이트 순위 작업의 쿼리 트리; 부정 토토 사이트 순위 한정이 추가된 원본 쿼리 트리
마지막으로 규칙이 다음과 같다면또한, 변경되지 않은 원래 쿼리 트리가 목록에 추가됩니다. 자격을 갖춘 사람만 이후로대신규칙은 이미 원본 쿼리 트리를 추가하므로 하나의 작업이 있는 규칙에 대해 하나 또는 두 개의 출력 쿼리 트리가 생성됩니다.
용삽입 중토토 사이트 순위, 원래 쿼리(억제되지 않은 경우대신)은 규칙에 따라 작업이 추가되기 전에 완료됩니다. 이렇게 하면 작업이 삽입된 행을 볼 수 있습니다. 하지만업데이트 중그리고삭제 중규칙, 원래 쿼리는 규칙에 의해 추가된 작업 후에 수행됩니다. 이렇게 하면 작업에서 업데이트되거나 삭제될 행을 볼 수 있습니다. 그렇지 않으면 해당 자격과 일치하는 행을 찾지 못하기 때문에 작업이 아무 작업도 수행하지 않을 수 있습니다.
규칙 작업에서 생성된 쿼리 트리는 다시 쓰기 시스템에 다시 던져지고 더 많은 규칙이 적용되어 쿼리 트리가 추가되거나 줄어들 수도 있습니다. 따라서 규칙의 작업은 규칙 자체와는 다른 명령 유형이나 다른 결과 관계를 가져야 합니다. 그렇지 않으면 이 재귀 프로세스는 무한 루프에 빠지게 됩니다. (규칙의 재귀적 확장이 감지되어 오류로 보고됩니다.)
다음 작업에서 발견된 쿼리 트리pg_rewrite시스템 카탈로그는 템플릿일 뿐입니다. 그들은 다음에 대한 범위 테이블 항목을 참조할 수 있기 때문에신규그리고오래된, 일부 대체 작업을 수행해야 사용할 수 있습니다. 참고로신규, 원래 쿼리의 대상 목록에서 해당 항목을 검색합니다. 발견되면 해당 항목의 표현식이 참조를 대체합니다. 그렇지 않으면,신규다음과 같음을 의미합니다오래된(에 대한업데이트) 또는 null 값으로 대체됩니다(삽입). 참조오래된은 결과 관계인 범위 테이블 항목에 대한 참조로 대체됩니다.
시스템은 업데이트 규칙 적용을 완료한 후 생성된 쿼리 트리에 보기 규칙을 적용합니다. 뷰는 새로운 업데이트 작업을 삽입할 수 없으므로 뷰 재작성 출력에 업데이트 규칙을 적용할 필요가 없습니다.
다음에 대한 변경 사항을 추적하고 싶다고 가정해 보겠습니다.sl_avail열신발끈_데이터관계. 그래서 우리는 로그 테이블과 다음과 같은 경우에 조건부로 로그 항목을 작성하는 규칙을 설정했습니다.업데이트다음 날짜에 수행됨신발끈_데이터.
CREATE TABLE 신발끈_로그(
sl_name text, -- 신발끈이 변경되었습니다.
sl_avail 정수, -- 새로운 사용 가능한 값
log_who 텍스트, -- 누가 그랬습니까?
log_when 타임스탬프 -- 언제
);
신발끈_데이터 업데이트 시 log_shoelace 토토 사이트 순위 생성
NEW.sl_avail < OLD.sl_avail 위치
신발끈_로그 값(
NEW.sl_name,
NEW.sl_avail,
현재_사용자,
현재_타임스탬프
);
이제 누군가가 합니다:
신발끈_데이터 설정 sl_avail = 6 WHERE sl_name = 'sl7'; 업데이트
그리고 로그 테이블을 살펴봅니다.
SELECT * FROM shoelace_log; sl_이름 | sl_avail | 로그_누구 | 로그_언제 ---------+----------+---------+--------- sl7 | 6 | 알 | 10월 20일 화요일 16:14:45 1998년 MET DST (1행)
그것이 우리가 기대했던 것입니다. 배경에서 일어난 일은 다음과 같습니다. 파서가 쿼리 트리를 생성했습니다.
신발끈_데이터 설정 sl_avail = 6 업데이트 FROM 신발끈_데이터 신발끈_데이터 신발끈_data.sl_name = 'sl7';
토토 사이트 순위이 있습니다log_shoelace그렇습니다업데이트 중토토 사이트 순위 한정 표현식 사용:
NEW.sl_avail < OLD.sl_avail
그리고 행동:
신발끈_로그 값에 삽입(
new.sl_name, new.sl_avail,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 신규, 신발끈_데이터 기존;
(평소에는 글을 쓸 수 없기 때문에 조금 이상해 보입니다.삽입...값...FROM. 그만큼발신여기 절은 쿼리 트리에 범위 테이블 항목이 있음을 나타냅니다.신규그리고오래된. 이는의 변수에서 참조할 수 있도록 필요합니다.삽입명령의 쿼리 트리.)
토토 사이트 순위은 정규화되었습니다.또한규칙이므로 규칙 시스템은 수정된 규칙 작업과 원래 쿼리 트리라는 두 개의 쿼리 트리를 반환해야 합니다. 1단계에서는 원래 쿼리의 범위 테이블이 규칙의 작업 쿼리 트리에 통합됩니다. 결과는 다음과 같습니다.
신발끈_로그 값에 삽입(
new.sl_name, new.sl_avail,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 신규, 신발끈_데이터 기존,신발끈_데이터 신발끈_데이터;
2단계에서는 규칙 제한이 추가되므로 결과 집합은 다음 행으로 제한됩니다.sl_avail변경사항:
신발끈_로그 값에 삽입(
new.sl_name, new.sl_avail,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 신규, 신발끈_데이터 기존,
신발끈_데이터 신발끈_데이터new.sl_avail < old.sl_avail;
(이건 더 이상해 보이는데, 그 이후로)삽입 ... 값다음이 없습니다어디에서절 중 하나를 선택해야 하지만 기획자와 실행자는 이에 대해 어려움을 겪지 않을 것입니다. 어쨌든 그들은 이 동일한 기능을 지원해야 합니다.삽입 ... 선택.)
3단계에서는 원래 쿼리 트리의 자격이 추가되어 결과 집합을 원래 쿼리에 의해 터치된 행으로만 추가로 제한합니다.
신발끈_로그 값에 삽입(
new.sl_name, new.sl_avail,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 신규, 신발끈_데이터 기존,
신발끈_데이터 신발끈_데이터
어디에 new.sl_avail < old.sl_availAND 신발끈_data.sl_name = 'sl7';
4단계는 다음에 대한 참조를 대체합니다.신규원래 쿼리 트리의 대상 목록 항목 또는 결과 관계의 일치하는 변수 참조로:
신발끈_로그 값에 삽입(신발끈_데이터.sl_name, 6, 현재_사용자, 현재_타임스탬프) FROM 신발끈_데이터 신규, 신발끈_데이터 기존, 신발끈_데이터 신발끈_데이터 어디6< old.sl_avail AND 신발끈_데이터.sl_name = 'sl7';
5단계 변경사항오래된결과 관계 참조에 대한 참조:
신발끈_로그 값에 삽입(
신발끈_데이터.sl_name, 6,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 신규, 신발끈_데이터 기존,
신발끈_데이터 신발끈_데이터
어디에서 6 <신발끈_data.sl_availAND 신발끈_데이터.sl_name = 'sl7';
그렇습니다. 규칙은 다음과 같습니다.또한, 원본 쿼리 트리도 출력합니다. 간단히 말해서, 규칙 시스템의 출력은 다음 문에 해당하는 두 개의 쿼리 트리 목록입니다.
신발끈_로그 값에 삽입(
신발끈_데이터.sl_name, 6,
현재_사용자, 현재_타임스탬프)
신발끈_데이터에서
어디 6 < shoelace_data.sl_avail
AND 신발끈_데이터.sl_name = 'sl7';
업데이트 신발끈_데이터 SET sl_avail = 6
sl_name = 'sl7';
이것들은 이 순서대로 실행되며, 이것이 바로 토토 사이트 순위이 의도한 바입니다.
대체 및 추가된 제한은 원래 쿼리가 다음과 같이 말하도록 보장합니다:
신발끈_데이터 설정 sl_color = '녹색' 업데이트 sl_name = 'sl7';
로그 항목이 기록되지 않습니다. 이 경우 원래 쿼리 트리에는에 대한 대상 목록 항목이 포함되어 있지 않습니다.sl_avail그래서NEW.sl_avail다음으로 대체됩니다신발끈_data.sl_avail. 따라서 규칙에 의해 생성된 추가 명령은 다음과 같습니다.
신발끈_로그 값에 삽입(
신발끈_데이터.sl_name,신발끈_data.sl_avail,
현재_사용자, 현재_타임스탬프)
신발끈_데이터에서
어디신발끈_data.sl_avail< 신발끈_데이터.sl_avail
AND 신발끈_데이터.sl_name = 'sl7';
그리고 그 자격은 결코 사실이 아닐 것입니다.
원래 쿼리가 여러 행을 수정하는 경우에도 작동합니다. 따라서 누군가가 다음 명령을 실행한 경우:
신발끈_데이터 설정 sl_avail = 0 업데이트 sl_color = '검은색';
사실 4개의 행이 업데이트됩니다(sl1, sl2, sl3및sl4). 하지만sl3이미 있습니다sl_avail = 0. 이 경우 원래 쿼리 트리 제한이 다르므로 추가 쿼리 트리가 생성됩니다.
신발끈_로그에 삽입
SELECT 신발끈_데이터.sl_name, 0,
현재_사용자, 현재_타임스탬프
신발끈_데이터에서
WHERE 0 < shoelace_data.sl_avail
그리고신발끈_data.sl_color = '토토 사이트 순위색';
규칙에 의해 생성됩니다. 이 쿼리 트리는 확실히 세 개의 새로운 로그 항목을 삽입합니다. 그리고 그것은 절대적으로 정확합니다.
여기서 원래 쿼리 트리가 마지막에 실행되는 것이 왜 중요한지 알 수 있습니다. 만약업데이트먼저 실행되었으므로 모든 행이 이미 0으로 설정되어 있으므로 로깅삽입행을 찾을 수 없습니다.0 < 신발끈_data.sl_avail.
누군가 실행을 시도할 수 있는 언급된 가능성으로부터 뷰 관계를 보호하는 간단한 방법삽입, 업데이트, 또는삭제그들은 해당 쿼리 트리가 버려지도록 하는 것입니다. 따라서 토토 사이트 순위을 만들 수 있습니다.
신발에 삽입할 때 shoe_ins_protect 토토 사이트 순위 생성
대신 아무것도 하지 마십시오.
신발 업데이트 시 shoe_upd_protect 토토 사이트 순위 생성
대신 아무것도 하지 마십시오.
신발 삭제 시 shoe_del_protect 토토 사이트 순위 생성
대신 아무것도 하지 마십시오.
이제 누군가가 뷰 관계에 대해 이러한 작업을 수행하려고 시도하는 경우신발, 규칙 시스템은 이러한 규칙을 적용합니다. 규칙에는 작업이 없고 다음과 같습니다.대신, 결과 쿼리 트리 목록은 비어 있게 되며 규칙 시스템이 완료된 후에는 최적화하거나 실행할 것이 아무것도 남지 않기 때문에 전체 쿼리가 아무것도 없게 됩니다.
규칙 시스템을 사용하는 보다 정교한 방법은 실제 테이블에서 올바른 작업을 수행하는 쿼리 트리를 다시 작성하는 규칙을 만드는 것입니다. 그렇게 하려면신발끈보기, 우리는 다음 규칙을 만듭니다:
신발끈에 삽입할 때와 같이 신발끈_인 규칙을 생성하세요.
대신에
신발끈_데이터 값에 삽입(
NEW.sl_name,
NEW.sl_avail,
NEW.sl_color,
NEW.sl_len,
NEW.sl_unit
);
신발끈 업데이트 시 규칙 shoelace_upd 생성
대신에
신발끈_데이터 업데이트
SET sl_name = NEW.sl_name,
sl_avail = NEW.sl_avail,
sl_color = NEW.sl_color,
sl_len = NEW.sl_len,
sl_unit = NEW.sl_unit
sl_name = OLD.sl_name은 어디에 있습니까?
신발끈 삭제 시 규칙 shoelace_del 생성
대신에
신발끈_데이터에서 삭제
sl_name = OLD.sl_name;
지원하고 싶다면돌아오는 중뷰에 대한 쿼리가 포함되도록 토토 사이트 순위을 만들어야 합니다.돌아오는 중뷰 행을 계산하는 절입니다. 이는 일반적으로 단일 테이블의 뷰에서는 매우 사소한 일이지만 다음과 같은 조인 뷰에서는 약간 지루합니다.신발끈. 삽입 사례의 예는 다음과 같습니다.
신발끈에 삽입할 때와 같이 신발끈_인 규칙을 생성하세요.
대신에
신발끈_데이터 값에 삽입(
NEW.sl_name,
NEW.sl_avail,
NEW.sl_color,
NEW.sl_len,
NEW.sl_unit
)
돌아오는 중
신발끈_데이터.*,
(SELECT 신발끈_데이터.sl_len * u.un_fact
FROM 유닛 u WHERE shoelace_data.sl_unit = u.un_name);
이 하나의 규칙은 둘 다를 지원한다는 점에 유의하세요.삽입그리고반환 삽입뷰에 대한 쿼리 —돌아오는 중절은 단순히 무시됩니다.삽입.
이제 가끔 신발끈 한 뭉치가 가게에 도착하고 그와 함께 큰 부품 목록도 도착한다고 가정해 보세요. 하지만 수동으로 업데이트하고 싶지는 않습니다.신발끈매번 봅니다. 대신 우리는 두 개의 작은 테이블을 설정했습니다. 하나는 부품 목록에서 항목을 삽입할 수 있는 테이블이고 다른 하나는 특별한 트릭이 있는 테이블입니다. 이에 대한 생성 명령은 다음과 같습니다.
CREATE TABLE 신발끈_도착(
arr_name 텍스트,
arr_퀀트 정수
);
CREATE TABLE 신발끈_확인(
ok_name 텍스트,
ok_Quant 정수
);
shoelace_ok에 삽입할 때와 마찬가지로 shoelace_ok_ins 규칙을 생성합니다.
대신에
신발끈 업데이트
SET sl_avail = sl_avail + NEW.ok_Quant
sl_name = NEW.ok_name;
이제 테이블을 채울 수 있습니다신발끈_도착부품 목록의 데이터 포함:
SELECT * FROM 신발끈_도착; arr_name | arr_Quant ---------+------------ sl3 | 10 sl6 | 20 sl8 | 20 (3행)
현재 데이터를 간단히 살펴보세요:
SELECT * 신발끈에서; sl_이름 | sl_avail | sl_color | sl_len | sl_유닛 | sl_len_cm -----------+----------+----------+---------+---------+------------ sl1 | 5 | 검정 | 80 | cm | 80 sl2 | 6 | 검정 | 100 | cm | 100 sl7 | 6 | 갈색 | 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행)
이제 도착한 신발끈을 다음 위치로 옮기세요:
신발끈_ok에 삽입 SELECT * FROM shoelace_arrive;
그리고 결과를 확인하세요:
SELECT * 신발끈에서 ORDER BY sl_name; sl_이름 | sl_avail | sl_color | sl_len | sl_유닛 | sl_len_cm -----------+----------+----------+---------+---------+------------ sl1 | 5 | 검정 | 80 | cm | 80 sl2 | 6 | 검정 | 100 | cm | 100 sl7 | 6 | 갈색 | 60 | cm | 60 sl4 | 8 | 검정 | 40 | 인치 | 101.6 sl3 | 10 | 검정 | 35 | 인치 | 88.9 sl8 | 21 | 갈색 | 40 | 인치 | 101.6 sl5 | 4 | 갈색 | 1 | 남 | 100 sl6 | 20 | 갈색 | 0.9 | 남 | 90 (8열) SELECT * 신발끈_로그에서; sl_이름 | sl_avail | log_who| 로그_언제 ---------+------------+---------+--------- sl7 | 6 | 알 | 10월 20일 화요일 19:14:45 1998년 MET DST sl3 | 10 | 알 | 10월 20일 화요일 19:25:16 1998년 MET DST sl6 | 20 | 알 | 10월 20일 화요일 19:25:16 1998년 MET DST sl8 | 21 | 알 | 10월 20일 화요일 19:25:16 1998년 MET DST (4행)
그것은 하나에서 멀리 떨어져 있습니다삽입 ... 선택이 결과에. 그리고 쿼리 트리 변환에 대한 설명은 이번 장의 마지막이 될 것입니다. 먼저 파서의 출력이 있습니다.
신발끈에 삽입_ok SELECT 신발끈_도착.arr_name, 신발끈_도착.arr_Quant FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인;
이제 첫 번째 토토 사이트 순위신발끈_ok_ins적용되어 다음과 같이 변합니다.
신발끈 업데이트
SET sl_avail = 신발끈.sl_avail + 신발끈_arrive.arr_Quant
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_괜찮아 낡은 것, 신발끈_괜찮아 새 것,
신발끈 신발끈
WHERE 신발끈.sl_name = 신발끈_arrive.arr_name;
그리고 원본을 버립니다삽입켜짐신발끈_ok. 이렇게 다시 작성된 쿼리는 다시 토토 사이트 순위 시스템으로 전달되고 두 번째로 적용된 토토 사이트 순위신발끈_upd생성:
신발끈_데이터 업데이트
SET sl_name = 신발끈.sl_name,
sl_avail = 신발끈.sl_avail + 신발끈_arrive.arr_Quant,
sl_color = 신발끈.sl_color,
sl_len = 신발끈.sl_len,
sl_unit = 신발끈.sl_unit
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_괜찮아 낡은 것, 신발끈_괜찮아 새 것,
신발끈 신발끈, 오래된 신발끈,
신발끈 새상품, 신발끈_데이터 신발끈_데이터
WHERE 신발끈.sl_name = 신발끈_arrive.arr_name
AND 신발끈_데이터.sl_name = 신발끈.sl_name;
또 그것은대신규칙과 이전 쿼리 트리가 삭제되었습니다. 이 쿼리는 여전히 뷰를 사용합니다.신발끈. 그러나 토토 사이트 순위 시스템은 이 단계로 끝나지 않으므로 계속해서 적용됩니다._RETURN규칙을 적용하면 다음과 같은 결과를 얻습니다.
신발끈_데이터 업데이트
SET sl_name = s.sl_name,
sl_avail = s.sl_avail + 신발끈_arrive.arr_Quant,
sl_color = s.sl_color,
sl_len = s.sl_len,
sl_unit = s.sl_unit
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_괜찮아 낡은 것, 신발끈_괜찮아 새 것,
신발끈 신발끈, 오래된 신발끈,
신발끈 새것, 신발끈_데이터 신발끈_데이터,
오래된 신발끈, 새 신발끈,
신발끈_데이터 s, 단위 u
어디서 s.sl_name = 신발끈_arrive.arr_name
AND 신발끈_데이터.sl_name = s.sl_name;
마지막으로, 토토 사이트 순위log_shoelace적용되어 추가 쿼리 트리가 생성됩니다.
신발끈_로그에 삽입
s.sl_name 선택,
s.sl_avail + 신발끈_도착.arr_Quant,
현재_사용자,
현재_타임스탬프
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_괜찮아 낡은 것, 신발끈_괜찮아 새 것,
신발끈 신발끈, 오래된 신발끈,
신발끈 새것, 신발끈_데이터 신발끈_데이터,
오래된 신발끈, 새 신발끈,
신발끈_데이터 s, 단위 u,
신발끈_데이터 기존, 신발끈_데이터 새
신발끈_로그 신발끈_로그
어디서 s.sl_name = 신발끈_arrive.arr_name
AND 신발끈_데이터.sl_name = s.sl_name
AND (s.sl_avail + 신발끈_arrive.arr_Quant) < s.sl_avail;
그 후 토토 사이트 순위 시스템은 토토 사이트 순위을 모두 소모하고 생성된 쿼리 트리를 반환합니다.
그래서 우리는 다음과 동일한 두 개의 최종 쿼리 트리로 끝납니다.SQL문장:
신발끈_로그에 삽입
s.sl_name 선택,
s.sl_avail + 신발끈_도착.arr_Quant,
현재_사용자,
현재_타임스탬프
FROM 신발끈_도착 신발끈_도착, 신발끈_데이터 신발끈_데이터,
신발끈_데이터
어디서 s.sl_name = 신발끈_arrive.arr_name
AND 신발끈_데이터.sl_name = s.sl_name
AND s.sl_avail + 신발끈_arrive.arr_Quant < s.sl_avail;
신발끈_데이터 업데이트
SET sl_avail = 신발끈_data.sl_avail + 신발끈_arrive.arr_Quant
FROM 신발끈_도착 신발끈_도착,
신발끈_데이터 신발끈_데이터,
신발끈_데이터
WHERE s.sl_name = 신발끈_arrive.sl_name
AND 신발끈_데이터.sl_name = s.sl_name;
결과적으로 한 관계에서 오는 데이터가 다른 관계에 삽입되고 세 번째 업데이트로 변경되고 네 번째 업데이트로 변경되고 다섯 번째 마지막 업데이트에 대한 로깅이 두 개의 쿼리로 줄어듭니다.
조금 보기 흉한 세부 사항이 있습니다. 두 쿼리를 살펴보면 다음과 같은 결과가 나옵니다.신발끈_데이터관계는 확실히 1로 줄어들 수 있는 범위 테이블에 두 번 나타납니다. 플래너는 이를 처리하지 않으므로 규칙 시스템 출력에 대한 실행 계획은삽입될 것이다
중첩 루프
- 병합 조인
- 서열 스캔
- 정렬
- s의 서열 스캔
- 서열 스캔
- 정렬
- 신발끈_도착 시 서열 스캔
- 신발끈_데이터의 서열 스캔
추가 범위 테이블 항목을 생략하면 다음과 같은 결과가 발생합니다.
병합 조인
- 서열 스캔
- 정렬
- s의 서열 스캔
- 서열 스캔
- 정렬
- 신발끈_도착 시 서열 스캔
로그 테이블에 정확히 동일한 항목을 생성합니다. 따라서 규칙 시스템으로 인해 테이블에 대한 추가 스캔이 발생했습니다.신발끈_데이터절대 필요하지 않습니다. 그리고 동일한 중복 검색이 다시 한 번 수행됩니다.업데이트. 하지만 그 모든 것을 가능하게 만드는 것은 정말 힘든 일이었습니다.
이제 우리는 마지막 시연을 보여줍니다.PostgreSQL규칙 시스템과 그 힘. 특별한 색상의 신발끈을 데이터베이스에 추가한다고 가정해 보겠습니다.
INSERT INTO 신발끈 VALUES('sl9', 0, 'pink', 35.0, 'inch', 0.0);
신발끈 값에 삽입('sl10', 1000, 'magenta', 40.0, 'inch', 0.0);
우리는 어떤 것을 확인하기 위한 뷰를 만들고 싶습니다신발끈항목의 색상이 어떤 신발에도 맞지 않습니다. 이에 대한 보기는 다음과 같습니다.
CREATE VIEW 신발끈_불일치 AS
SELECT * 존재하지 않는 신발끈에서
(slcolor = sl_color인 신발에서 신발 이름 선택);
출력은 다음과 같습니다:
SELECT * 신발끈_불일치에서; sl_이름 | sl_avail | sl_color | sl_len | sl_유닛 | sl_len_cm ---------+----------+----------+---------+---------+---------- sl9 | 0 | 핑크 | 35 | 인치 | 88.9 sl10 | 1000 | 마젠타색 | 40 | 인치 | 101.6
이제 우리는 재고가 없는 일치하지 않는 신발끈이 데이터베이스에서 삭제되도록 설정하고 싶습니다. 조금 더 어렵게 만들기 위해PostgreSQL, 직접 삭제하지는 않습니다. 대신 뷰를 하나 더 만듭니다.
CREATE VIEW 신발끈_can_delete AS
SELECT * FROM shoelace_mismatch WHERE sl_avail = 0;
이렇게 하세요:
존재하는 신발끈에서 삭제
(SELECT * FROM 신발끈_can_delete
sl_name = 신발끈.sl_name);
짜잔아:
SELECT * 신발끈에서; sl_이름 | sl_avail | sl_color | sl_len | sl_유닛 | sl_len_cm ---------+----------+----------+---------+---------+---------- sl1 | 5 | 검정 | 80 | cm | 80 sl2 | 6 | 검정 | 100 | cm | 100 sl7 | 6 | 갈색 | 60 | cm | 60 sl4 | 8 | 검정 | 40 | 인치 | 101.6 sl3 | 10 | 검정 | 35 | 인치 | 88.9 sl8 | 21 | 갈색 | 40 | 인치 | 101.6 sl10 | 1000 | 마젠타색 | 40 | 인치 | 101.6 sl5 | 4 | 갈색 | 1 | 남 | 100 sl6 | 20 | 갈색 | 0.9 | 남 | 90 (9행)
A 삭제뷰에서 총 4개의 중첩/조인된 뷰를 사용하는 하위 쿼리 제한이 있는 뷰에서 그 중 하나 자체에 뷰가 포함된 하위 쿼리 제한이 있고 계산된 뷰 열이 사용되는 경우 실제 테이블에서 요청된 데이터를 삭제하는 하나의 단일 쿼리 트리로 다시 작성됩니다.
현실 세계에서 그러한 구성이 필요한 상황은 아마도 몇 가지 밖에 없을 것입니다. 하지만 효과가 있어서 마음이 편해지네요.