다음에 정의된 규칙삽입, 업데이트및삭제보기와 크게 다릅니다. 이전 섹션에서 설명한 규칙입니다. 첫째, 그들의토토 사이트 생성명령은 더 많은 것을 허용합니다:
그들은 아무런 조치도 취할 수 없습니다.
그들은 여러 가지 행동을 가질 수 있습니다.
그들은 그럴 수 있습니다대신또는또한(기본값).
의사관계신규그리고오래된유용해집니다.
그들은 토토 사이트 제한을 가질 수 있습니다.
둘째, 그들은 쿼리 트리를 제자리에서 수정하지 않습니다. 대신에 0개 이상의 새로운 쿼리 트리를 생성하고 원본.
구문을 유지하세요
토토 사이트 생성 [ 또는 교체 ]이름켜짐이벤트TO테이블[ 어디조건]
하세요 [ 또한 | 대신 ] 아무것도 |명령 | ( 명령 ; 명령 ... ) }
생각해 보세요. 다음에서,업데이트 규칙다음에 정의된 규칙을 의미합니다.삽입, 업데이트또는삭제.
업데이트 규칙은 결과가 나올 때 규칙 시스템에 의해 적용됩니다. 관계 및 쿼리 트리의 명령 유형은 에 주어진 객체와 이벤트만들기 토토 사이트명령. 업데이트 규칙의 경우 규칙 시스템은 쿼리 트리 목록입니다. 처음에는 쿼리 트리 목록이 비어 있습니다. 0이 있을 수 있습니다(아무것도 없음키워드), 하나 또는 여러 작업. 단순화하기 위해 규칙을 살펴보겠습니다. 한 번의 행동으로. 이 규칙에는 자격이 있을 수도 있고 없을 수도 있으며 그럴 수도 있지대신또는또한(기본값).
토토 사이트 제한이란 무엇입니까? 제한사항을 알려주는 내용입니다 토토 사이트의 작업을 수행해야 하는 경우와 수행하지 않는 경우. 이것 자격은 의사 관계만 참조할 수 있습니다.신규및/또는오래된, 기본적으로 객체로 주어진 관계를 표현합니다(그러나 특별한 의미로).
따라서 다음 쿼리를 생성하는 세 가지 경우가 있습니다. 단일 작업 규칙의 트리입니다.
원본이 포함된 토토 사이트 작업의 쿼리 트리 쿼리 트리의 자격이 추가되었습니다.
토토 사이트이 포함된 토토 사이트 작업의 쿼리 트리 자격 및 원래 쿼리 트리의 자격 추가됨
토토 사이트이 포함된 토토 사이트 작업의 쿼리 트리 자격 및 원래 쿼리 트리의 자격; 원래 쿼리 트리에는 부정 토토 사이트 제한이 추가되었습니다.
마지막으로 규칙이 다음과 같다면또한, 변경되지 않은 원래 쿼리 트리가 목록에 추가됩니다. 이후로 자격 있는대신규칙이 이미 추가되었습니다. 원래 쿼리 트리에서는 하나 또는 두 개로 끝납니다. 하나의 작업으로 규칙에 대한 쿼리 트리를 출력합니다.
용삽입 중토토 사이트, 원본 쿼리(억제되지 않은 경우대신) 규칙에 의해 추가된 작업보다 먼저 수행됩니다. 이를 통해 삽입된 행을 확인하는 작업입니다. 하지만업데이트 중그리고삭제 중규칙에 따라 원래 쿼리는 다음에 의해 추가된 작업 후에 수행됩니다. 규칙. 이렇게 하면 작업이 업데이트될 항목을 볼 수 있습니다. 또는 삭제될 행; 그렇지 않으면 작업이 아무 작업도 수행하지 않을 수 있습니다. 자격과 일치하는 행을 찾지 못했기 때문입니다.
규칙 작업에서 생성된 쿼리 트리는 시스템을 다시 작성하면 더 많은 규칙이 적용될 수도 있습니다. 결과적으로 더 많거나 적은 쿼리 트리가 생성됩니다. 따라서 규칙의 동작은 다음과 같아야 합니다. 명령 유형이 다르거나 결과가 다릅니다 규칙 자체가 켜져 있는 관계보다 그렇지 않으면 이 재귀적 프로세스가 무한 루프에 빠지게 됩니다. (재귀 확장 규칙이 감지되어 오류로 보고됩니다.)
다음 작업에서 발견된 쿼리 트리pg_rewrite시스템 카탈로그는 템플릿일 뿐입니다. 그들은 다음에 대한 범위 테이블 항목을 참조할 수 있기 때문에신규그리고오래된, 일부 대체는 사용하기 전에 이루어져야 합니다. 누구에게나 참조신규, 대상 목록 원래 쿼리에서 해당 항목이 검색됩니다. 만약에 찾은 경우 해당 항목의 표현식이 참조를 대체합니다. 그렇지 않으면,신규다음과 같음을 의미함오래된(에 대한업데이트) 또는 null 값으로 대체됩니다(의 경우삽입). 참조오래된은 다음에 대한 참조로 대체됩니다. 결과 관계인 범위 테이블 항목입니다.
시스템이 업데이트 규칙 적용을 완료한 후 적용됩니다. 생성된 쿼리 트리에 대한 규칙을 봅니다. 뷰를 삽입할 수 없습니다. 새로운 업데이트 작업이 있으므로 업데이트 규칙을 적용할 필요가 없습니다. 뷰 재작성 결과.
우리가 다음에 대한 변경 사항을 추적하고 싶다고 가정해 보겠습니다.sl_avail열의신발끈_데이터관계. 그래서 우리는 로그를 설정했습니다 테이블과 다음과 같은 경우 조건부로 로그 항목을 작성하는 규칙 an업데이트다음 날짜에 수행됨신발끈_데이터.
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 신발끈_데이터 *NEW*, 신발끈_데이터 *OLD*;
(평소에는 할 수 없기 때문에 조금 이상해 보입니다. 쓰다삽입 ... 값 ... FROM. 그만큼발신여기 절은 단지 쿼리 트리에 범위 테이블 항목이 있음을 나타냅니다. 을 위한*신규*그리고*오래된*. 이것들은 그들이 될 수 있도록 필요합니다 의 변수에서 참조됨삽입명령의 쿼리 트리.)
토토 사이트은 정규화되었습니다.또한규칙이므로 규칙 시스템은 두 개의 쿼리 트리를 반환해야 합니다. 수정된 규칙 작업 및 원래 쿼리 트리. 1단계에서는 원래 쿼리의 범위 테이블이 규칙의 작업 쿼리 트리. 결과는 다음과 같습니다.
신발끈_로그 값에 삽입(
*NEW*.sl_name, *NEW*.sl_avail,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 *NEW*, 신발끈_데이터 *OLD*,신발끈_데이터 신발끈_데이터;
2단계에서는 규칙 제한이 추가되므로 결과 집합은 다음과 같은 행으로 제한됩니다.sl_avail변경사항:
신발끈_로그 값에 삽입(
*NEW*.sl_name, *NEW*.sl_avail,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 *NEW*, 신발끈_데이터 *OLD*,
신발끈_데이터 신발끈_데이터어디 *NEW*.sl_avail < *OLD*.sl_avail;
(이건 더 이상해 보이는데, 그 이후로)삽입 ... 값다음이 없습니다어디절 중 하나지만 플래너와 집행자는 그것에 어려움을 겪지 않을 것입니다. 그들은 다음을 수행해야 합니다. 어쨌든 이 동일한 기능을 지원합니다.삽입 ... 선택.)
3단계에서 원래 쿼리 트리의 자격은 다음과 같습니다. 추가되어 결과 집합을 행으로만 추가로 제한합니다. 원래 쿼리에 의해 영향을 받았을 것입니다:
신발끈_로그 값에 삽입(
*NEW*.sl_name, *NEW*.sl_avail,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 *NEW*, 신발끈_데이터 *OLD*,
신발끈_데이터 신발끈_데이터
*NEW*.sl_avail < *OLD*.sl_avail 위치AND 신발끈_data.sl_name = 'sl7';
4단계는 다음에 대한 참조를 대체합니다.신규원본 쿼리 트리의 대상 목록 항목별 또는 결과에서 일치하는 변수 참조 관계:
신발끈_로그 값에 삽입(신발끈_데이터.sl_name, 6,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 *NEW*, 신발끈_데이터 *OLD*,
신발끈_데이터 신발끈_데이터
어디6< *OLD*.sl_avail
AND 신발끈_데이터.sl_name = 'sl7';
5단계 변경사항오래된참고자료 결과 관계 참조로:
신발끈_로그 값에 삽입(
신발끈_데이터.sl_name, 6,
현재_사용자, 현재_타임스탬프)
FROM 신발끈_데이터 *NEW*, 신발끈_데이터 *OLD*,
신발끈_데이터 신발끈_데이터
어디에서 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 토토 사이트 생성
대신 아무것도 하지 마십시오.
이제 누군가가 이 작업 중 하나를 수행하려고 시도하면 관계 보기신발, 규칙 시스템 이 규칙을 적용하겠습니다. 규칙에는 작업이 없고 다음과 같습니다.대신, 쿼리 결과 목록 트리는 비어 있고 전체 쿼리는 아무것도 되지 않습니다. 이후에는 최적화하거나 실행할 것이 아무것도 없기 때문입니다. 토토 사이트 시스템이 완료되었습니다.
규칙 시스템을 사용하는 보다 정교한 방법은 다음을 만드는 것입니다. 쿼리 트리를 올바른 트리로 다시 작성하는 규칙 실제 테이블에서의 작업. 그렇게 하려면신발끈view, 우리는 다음을 생성합니다 규칙:
신발끈에 삽입할 때와 같이 신발끈_인 규칙을 생성하세요.
대신에
신발끈_데이터 값에 삽입(
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 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_확인 *오래됨*, 신발끈_확인 *신규*,
신발끈 신발끈, 신발끈 *OLD*,
신발끈 *NEW*, 신발끈_데이터 신발끈_데이터
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 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_확인 *오래됨*, 신발끈_확인 *신규*,
신발끈 신발끈, 신발끈 *OLD*,
신발끈 *NEW*, 신발끈_데이터 신발끈_데이터,
신발끈 *오래된*, 신발끈 *새상품*,
신발끈_데이터 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 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_확인 *오래됨*, 신발끈_확인 *신규*,
신발끈 신발끈, 신발끈 *OLD*,
신발끈 *NEW*, 신발끈_데이터 신발끈_데이터,
신발끈 *오래된*, 신발끈 *새상품*,
신발끈_데이터 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;
결과적으로 하나의 관계에서 오는 데이터가 삽입되었습니다. 다른 것으로, 세 번째 업데이트로 변경, 다음으로 변경 네 번째 업데이트와 다섯 번째 업데이트의 최종 업데이트 기록 두 개의 쿼리로 축소됩니다.
약간 보기 흉한 세부 사항이 있습니다. 을 보면서 두 개의 쿼리를 실행한 결과 다음과 같은 결과가 나왔습니다.신발끈_데이터관계가 확실히 하나로 줄일 수 있는 범위 테이블입니다. 그만큼 플래너가 이를 처리하지 않으므로 실행 계획은 의 규칙 시스템 출력삽입할 것이다 BE
중첩 루프
- 병합 조인
- 서열 스캔
- 정렬
- s의 서열 스캔
- 서열 스캔
- 정렬
- 신발끈_도착 시 서열 스캔
- 신발끈_데이터의 서열 스캔
추가 범위 테이블 항목을 생략하면 다음과 같은 결과가 발생합니다. 에이
병합 조인
- 서열 스캔
- 정렬
- s의 서열 스캔
- 서열 스캔
- 정렬
- 신발끈_도착 시 서열 스캔
로그 테이블에 정확히 동일한 항목을 생성합니다. 따라서 규칙 시스템으로 인해 테이블에 대한 추가 스캔이 발생했습니다.신발끈_데이터절대 그렇지 않습니다 필요한. 그리고 동일한 중복 검색이 다시 한 번 수행됩니다.업데이트. 그런데 정말 힘든 일이었어. 그 모든 것을 가능하게 하려고요.
이제 우리는 마지막 시연을 보여줍니다.PostgreSQL규칙 시스템과 그 힘. 말하다 당신은 특별한 색상의 신발끈을 당신의 신발에 추가합니다 데이터 베이스:
신발끈 값에 삽입('sl9', 0, '핑크', 35.0, '인치', 0.0);
신발끈 값에 삽입('sl10', 1000, 'magenta', 40.0, 'inch', 0.0);
우리는 어떤 것을 확인하기 위한 뷰를 만들고 싶습니다신발끈항목의 색상이 어떤 신발에도 맞지 않습니다. 이에 대한 견해는 다음과 같습니다
신발끈_불일치 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개의 중첩/결합된 뷰를 사용하는 제한입니다. 그 중 하나 자체에는 다음을 포함하는 하위 쿼리 자격이 있습니다. 보기 및 계산된 보기 열이 사용되는 위치가 다시 작성됩니다. 요청된 데이터를 삭제하는 하나의 단일 쿼리 트리로 진짜 테이블.
실제로는 몇 가지 상황만 있을 수 있습니다. 그러한 구조가 필요한 세상. 하지만 그것은 당신을 만든다 효과가 있어서 편해요.