삽입
, 업데이트
및삭제
정의 된 스포츠 토토삽입
, 업데이트
및삭제
는 이전 섹션에 설명 된보기 규칙과 크게 다릅니다. 첫째, 그들의스포츠 토토 만들기
명령은 더 많은 것을 허용합니다 :
아무런 조치도 취할 수 없습니다.
여러 조치를 취할 수 있습니다.
될 수 있습니다대신
또는또한
(기본값).
가사선NEW
andold
유용해진다.
스포츠 토토 자격을 가질 수 있습니다.
둘째, 쿼리 트리를 제자리에 수정하지 않습니다. 대신 그들은 0 이상의 새로운 쿼리 트리를 생성하고 원래 나무를 버릴 수 있습니다.
많은 경우 스포츠 토토에 따라 수행 할 수있는 작업삽입
/업데이트
/삭제
트리거로 더 잘 수행됩니다. 트리거는 악화적으로 조금 더 복잡하지만 의미론은 이해하기 훨씬 간단합니다. 원래 쿼리에 휘발성 기능이 포함되어있을 때 스포츠 토토은 놀라운 결과를 가져 오는 경향이 있습니다. 휘발성 함수는 스포츠 토토을 수행하는 과정에서 예상보다 더 많은 시간을 실행할 수 있습니다.
또한 이러한 유형의 규칙에 의해 전혀 지원되지 않는 경우, 특히with
원래 쿼리 및 다중 할당 하위의 조항select
s inSET
목록업데이트
쿼리. 이러한 구성을 스포츠 토토 쿼리로 복사하면 쿼리 저자의 표현 의도와는 반대로 하위 쿼리의 여러 평가가 발생하기 때문입니다..
구문 유지 :
만들기 [또는 교체] 규칙이름
ac이벤트
to테이블
[where조건
] [또한 | 대신] 아무것도 |명령
| (명령
;명령
...)
염두에 두십시오. 다음에서규칙 업데이트정의 된 스포츠 토토을 의미삽입
, 업데이트
또는삭제
.
결과 관계와 쿼리 트리의 명령 유형이 |스포츠 토토 작성
명령. 업데이트 규칙의 경우 규칙 시스템은 쿼리 트리 목록을 만듭니다. 처음에는 쿼리 트리 목록이 비어 있습니다. 0이있을 수 있습니다 (아무것도
키 단어), 하나 또는 여러 조치. 단순화하기 위해, 우리는 하나의 행동으로 규칙을 살펴볼 것입니다. 이 규칙은 자격을 가질 수 있고 그렇지 않을 수 있습니다.대신
또는또한
(기본값).
스포츠 토토 자격이란 무엇입니까? 스포츠 토토의 행동이 언제 수행되어야하는지와 그렇지 않은 경우에 알려주는 것은 제한입니다. 이 자격은 유사성 만 참조 할 수 있습니다NEW
및/또는old
, 기본적으로 객체로 주어진 관계 (그러나 특별한 의미를 가진)를 나타냅니다.
따라서 일회용 규칙을 위해 다음 쿼리 트리를 생성하는 세 가지 사례가 있습니다.
또한
또는대신
원래 쿼리 트리의 자격이 추가 된 스포츠 토토 조치의 쿼리 트리
또한
규칙 자격과 원래 쿼리 트리의 자격이 추가 된 스포츠 토토 조치의 쿼리 트리
대신
스포츠 토토 자격과 원래 쿼리 트리의 자격을 갖춘 스포츠 토토 조치의 쿼리 트리; 부정적인 스포츠 토토 자격이 추가 된 원래 쿼리 트리
마지막으로 스포츠 토토이있는 경우또한
, 변경되지 않은 원래 쿼리 트리가 목록에 추가됩니다. 자격을 갖춘 이후대신
규칙은 이미 원래 쿼리 트리를 추가하고, 하나 또는 두 개의 출력 쿼리 트리를 한 번의 동작으로 규칙으로 만듭니다..
forinsert
스포츠 토토, 원래 쿼리 (억제되지 않은 경우대신
)는 규칙에 따라 추가 된 작업 전에 수행됩니다. 이를 통해 동작은 삽입 된 행을 볼 수 있습니다. 하지만on Update
및ON DELETE
규칙, 원래 쿼리는 규칙에 따라 추가 된 조치 후에 수행됩니다. 이를 통해 동작이 업데이트 된 행 또는 삭제 될 행을 볼 수 있습니다. 그렇지 않으면, 행동은 자격과 일치하는 행을 찾지 않기 때문에 아무것도하지 않을 수 있습니다.
규칙 조치에서 생성 된 쿼리 트리는 다시 작성 시스템에 다시 던져지고 더 많은 규칙이 적용되어 추가 쿼리 트리가 추가로 적용됩니다. 따라서 규칙의 동작은 규칙 자체와 다른 명령 유형 또는 다른 결과 관계를 가져야합니다. 그렇지 않으면이 재귀 프로세스는 무한 루프로 끝납니다. (규칙의 재귀 확장이 감지되어 오류로보고됩니다.)
쿼리 트리의 행동에서 발견 된 쿼리 트리pg_rewrite
시스템 카탈로그는 단지 템플릿입니다. 그들은 범위 테이블 항목을 참조 할 수 있기 때문에NEW
andold
, 일부 대체물을 사용하기 전에 만들어야합니다. 에 대한 참조.NEW
, 원래 쿼리의 대상 목록은 해당 항목을 검색합니다. 발견되면 해당 항목의 표현식은 참조를 대체합니다. 그렇지 않으면,NEW
는와 동일합니다.old
(업데이트
) 또는 널 값으로 대체됩니다 (삽입
). 에 대한 참조old
결과 관계 인 범위 테이블 항목에 대한 참조로 대체됩니다.
시스템이 업데이트 규칙을 적용한 후 생성 된 쿼리 트리에보기 규칙을 적용합니다. 뷰는 새로운 업데이트 작업을 삽입 할 수 없으므로 view 재 작성 출력에 업데이트 규칙을 적용 할 필요가 없습니다.
우리가의 변화를 추적하고 싶다고 말합니다SL_AVAIL
열의 열Shoelace_data
관계. 그래서 우리는 로그 테이블과 조건부로 로그 항목을 작성하는 규칙을 설정했습니다.업데이트
에서 수행됩니다Shoelace_data
.
테이블 생성 shoelace_log ( SL_NAME 텍스트 - -Hoelace가 변경되었습니다 SL_AVAIL INTEGER - 새로운 가용 값 log_who 텍스트 - 누가 그랬습니다 log_ 시절 시간 - 언제 ); shoelace_data에 대한 업데이트시 규칙 log_shoelace를 만듭니다 어디서 New.sl_avail < Old.sl_avail shoelace_log 값에 삽입하십시오 ( new.sl_name, new.sl_avail, current_user, current_timestamp );
이제 누군가 :
Shoelace_Data 업데이트 sl_avail = 6 여기서 sl_name = 'sl7';
그리고 우리는 로그 테이블을 봅니다 :
SHOELACE_LOG에서 선택 *; sl_name | SL_AVAIL | log_who | log_when ---------+----------+---------+------------------------------------- SL7 | 6 | al | Tue 10 월 20 일 16:14:45 1998 Met Dst (1 행)
그것이 우리가 기대했던 것입니다. 백그라운드에서 일어난 일은 다음과 같습니다. 파서는 쿼리 트리를 만들었습니다.
Shoelace_Data 업데이트 SL_AVAIL = 6 Shoelace_data에서 Shoelace_data에서 여기서 shoelace_data.sl_name = 'sl7';
스포츠 토토이 있습니다log_shoelace
on update
스포츠 토토 자격 표현 :
new.sl_avail < Old.sl_avail
및 조치 :
shoelace_log 값에 삽입 ( new.sl_name, new.sl_avail, current_user, current_timestamp) Shoelace_data에서 New, Shoelace_data Old;
(일반적으로 쓸 수 없기 때문에 조금 이상해 보입니다삽입 ... 값 ... From
. 그만큼From
절에서 조항은 쿼리 트리에 Query Tree 항목이 있음을 나타내는 것입니다.NEW
andold
. 이들은의 변수로 참조 할 수 있도록 필요합니다.삽입
명령의 쿼리 트리.)
스포츠 토토은 자격을 갖추고 있습니다또한
규칙, 따라서 규칙 시스템은 수정 된 규칙 조치와 원래 쿼리 트리의 두 개의 쿼리 트리를 반환해야합니다. 1 단계에서 원래 쿼리의 범위 테이블이 규칙의 조치 쿼리 트리에 포함됩니다. 이것은 다음과 같은 결과를 초래합니다.
shoelace_log 값에 삽입 (
new.sl_name, new.sl_avail,
current_user, current_timestamp)
Shoelace_data에서 New, Shoelace_data Old,shoelace_data shoelace_data;
2 단계에서는 스포츠 토토 자격이 추가되므로 결과 세트는 줄로 제한됩니다.SL_AVAIL
변경 :
shoelace_log 값에 삽입 (
new.sl_name, new.sl_avail,
current_user, current_timestamp)
Shoelace_data에서 New, Shoelace_data Old,
shoelace_data shoelace_dataWhere New.sl_avail < Old.sl_avail;
삽입 ... 값
여기서
조항이지만 플래너와 집행자는 어려움을 겪지 않을 것입니다. 그들은 어쨌든이 동일한 기능을 지원해야합니다.삽입 ... 선택
.)
3 단계에서 원래 쿼리 트리의 자격이 추가되어 결과 세트가 원래 쿼리에 의해 터치 된 행으로 만 추가로 제한됩니다..
shoelace_log 값에 삽입 (
new.sl_name, new.sl_avail,
current_user, current_timestamp)
Shoelace_data에서 New, Shoelace_data Old,
shoelace_data shoelace_data
어디 new.sl_avail < old.sl_avail및 shoelace_data.sl_name = 'sl7';
4 단계 참조를 대체NEW
원래 쿼리 트리의 대상 목록 항목 또는 결과 관계의 일치 변수 참조 :
shoelace_log 값에 삽입 (shoelace_data.sl_name, 6, current_user, current_timestamp) Shoelace_data에서 New, Shoelace_data Old, shoelace_data shoelace_data 어디6< Old.sl_avail 및 shoelace_data.sl_name = 'sl7';
5 단계 변경old
결과 관계 참조 참조 :
shoelace_log 값에 삽입
shoelace_data.sl_name, 6,
current_user, current_timestamp)
Shoelace_data에서 New, Shoelace_data Old,
shoelace_data shoelace_data
여기서 6 <shoelace_data.sl_avail및 shoelace_data.sl_name = 'sl7';
그게 다야. 스포츠 토토이이므로또한
, 원래 쿼리 트리도 출력합니다. 요컨대, 규칙 시스템의 출력은 다음과 같은 진술에 해당하는 두 개의 쿼리 트리 목록입니다.
shoelace_log 값에 삽입 shoelace_data.sl_name, 6, current_user, current_timestamp) shoelace_data에서 여기서 6 < shoelace_data.sl_avail 및 shoelace_data.sl_name = 'sl7'; Shoelace_Data 업데이트 SL_AVAIL = 6을 업데이트하십시오 여기서 sl_name = 'sl7';
이 순서로 실행됩니다. 이것이 바로 스포츠 토토이해야 할 일입니다.
추가 자격과 추가 자격은 원래 쿼리가 다음과 같은 경우 :
Shoelace_Data 업데이트 sl_color = 'Green' 여기서 sl_name = 'sl7';
로그 항목이 작성되지 않습니다. 이 경우 원래 쿼리 트리에는 대상 목록 항목이 포함되어 있지 않습니다.SL_AVAIL
, sonew.sl_avail
shoelace_data.sl_avail
. 따라서 규칙에 의해 생성 된 추가 명령은 다음과 같습니다.
shoelace_log 값에 삽입 shoelace_data.sl_name,shoelace_data.sl_avail, current_user, current_timestamp) shoelace_data에서 어디shoelace_data.sl_avail< shoelace_data.sl_avail 및 shoelace_data.sl_name = 'sl7';
그리고 그 자격은 결코 사실이 아닙니다.
원래 쿼리가 여러 행을 수정하면 작동합니다. 그래서 누군가가 명령을 발행했다면 :
업데이트 shoelace_data set sl_avail = 0 여기서 sl_color = 'black';
실제로 4 개의 행이 업데이트됩니다 (SL1
, SL2
, SL3
및SL4
). 하지만SL3
이미SL_AVAIL = 0
. 이 경우 원래 쿼리 트리 자격이 다르고 추가 쿼리 트리가 발생합니다.
shoelace_log에 삽입하십시오
shoelace_data.sl_name, 0, 선택을 선택하십시오.
current_user, current_timestamp
shoelace_data에서
여기서 0 < shoelace_data.sl_avail
그리고shoelace_data.sl_color = 'black';
규칙에 의해 생성됩니다. 이 쿼리 트리는 반드시 3 개의 새로운 로그 항목을 삽입합니다. 그리고 그것은 절대적으로 맞습니다.
여기서 원래 쿼리 트리가 마지막으로 실행되는 것이 중요한 이유를 알 수 있습니다. 인 경우업데이트
먼저 실행되었으며 모든 행이 이미 0으로 설정되었으므로 로깅삽입
어떤 행을 찾지 못할 것입니다0 < shoelace_data.sl_avail
.
누군가가 달리려고 할 수있는 언급 가능성으로부터보기 관계를 보호하는 간단한 방법삽입
, 업데이트
또는삭제
그들 위에는 그 쿼리 나무가 버리도록하는 것입니다. 그래서 우리는 스포츠 토토을 만들 수 있습니다 :
신발 삽입에 rule shoe_ins_protect를 작성하십시오 대신 아무것도하지 않습니다. 신발 업데이트와 같이 규칙 신발 _upd_protect를 만듭니다 대신 아무것도하지 않습니다. 삭제에서 신발 삭제와 같이 규칙 신발을 만듭니다 대신 아무것도하지 말라;
누군가가 지금보기 관계에서 이러한 작업을 수행하려고한다면신발
, 스포츠 토토 시스템은이 스포츠 토토을 적용합니다. 스포츠 토토에는 조치가없고대신
, 쿼리 트리의 결과 목록이 비어 있고 규칙 시스템이 완료된 후에 최적화되거나 실행될 것이 없기 때문에 전체 쿼리가 없을 것입니다.
규칙 시스템을 사용하는보다 정교한 방법은 실제 테이블에서 올바른 작동을 수행하는 쿼리 트리를 다시 작성하는 규칙을 작성하는 것입니다. 에서 그렇게하려면Shoelace
보기, 다음 규칙을 만듭니다.
Shoelace에 인서트와 같이 규칙 shoelace_ins를 만듭니다 대신하십시오 shoelace_data 값에 삽입 ( new.sl_name, new.sl_avail, new.sl_color, new.sl_len, new.sl_unit ); Shoelace 업데이트시 Rule Shoelace_upd를 만듭니다 대신하십시오 Shoelace_data를 업데이트하십시오 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을 만듭니다 대신하십시오 shoelace_data에서 삭제합니다 여기서 sl_name = old.sl_name;
지원하려는 경우반환
보기에 쿼리, 스포츠 토토을 포함해야합니다반환
보기 행을 계산하는 클로스. 이것은 일반적으로 단일 테이블의보기에 매우 사소하지만와 같은 조회수는 약간 지루합니다.Shoelace
. 삽입 케이스의 예는 다음과 같습니다.
Shoelace에 인서트와 같이 규칙 shoelace_ins를 만듭니다 대신하십시오 shoelace_data 값에 삽입 ( new.sl_name, new.sl_avail, new.sl_color, new.sl_len, new.sl_unit )) 반환 shoelace_data.*, (shoelace_data.sl_len * u.un_fact를 선택하십시오 UNIT U에서 Shoelace_data.sl_unit = u.un_name);
이 하나의 규칙은 두 가지 모두를 지원합니다삽입
and반환 삽입
보기 쿼리 -반환
조항은 단순히 무시됩니다삽입
.
이제 한 번에 한 팩이 상점에 도착하고 큰 부품 목록과 함께 도착한다고 가정합니다. 하지만 수동으로 업데이트하고 싶지 않습니다Shoelace
매번보기. 대신 우리는 두 개의 작은 테이블을 설정했습니다. 하나는 부품 목록에서 항목을 삽입 할 수 있고 하나는 특별한 트릭이 있습니다. 이것들에 대한 창조 명령은 다음과 같습니다.
테이블 생성 shoelace_arrive ( arr_name 텍스트, arr_quant 정수 ); 테이블 생성 shoelace_ok ( ok_name 텍스트, OK_QUANT 정수 ); shoelace_ok에 삽입 된 insert와 같이 규칙 shoelace_ok_ins를 만듭니다 대신하십시오 Shoelace를 업데이트하십시오 sl_avail = sl_avail + new.ok_quant를 설정합니다 여기서 sl_name = new.ok_name;
이제 테이블을 채울 수 있습니다Shoelace_arrive
부품 목록의 데이터와 함께 :
SHOELACE_ARRIVE에서 * 선택 *; arr_name | arr_quant ----------+----------- SL3 | 10 SL6 | 20 SL8 | 20 (3 줄)
현재 데이터를 빨리 살펴보십시오 :
Shoelace에서 선택 *; sl_name | SL_AVAIL | SL_COLOR | SL_LEN | SL_UNIT | 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 | m | 100 SL6 | 0 | 브라운 | 0.9 | m | 90 (8 줄)
이제 도착한 신발을 옮기십시오 :
shoelace_ok에 삽입 * shoelace_arrive;
결과 확인 :
SL_NAME의 Shoelace Order에서 선택 * 선택; sl_name | SL_AVAIL | SL_COLOR | SL_LEN | SL_UNIT | 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 | m | 100 SL6 | 20 | 브라운 | 0.9 | m | 90 (8 줄) shoelace_log에서 *를 선택하십시오. sl_name | SL_AVAIL | log_who | log_when ---------+----------+--------+------------------------------------- SL7 | 6 | al | Tue 10 월 20 일 19:14:45 1998 Met Dst SL3 | 10 | al | Tue 10 월 20 일 19:25:16 1998 Met Dst SL6 | 20 | al | Tue 10 월 20 일 19:25:16 1998 Met Dst SL8 | 21 | al | Tue 10 월 20 일 19:25:16 1998 Met Dst (4 줄)
하나부터 먼 길입니다삽입 ... 선택
이 결과에. 그리고 쿼리 트리 변환에 대한 설명은이 장에서 마지막이 될 것입니다. 첫째, 파서의 출력이 있습니다 :
shoelace_ok에 삽입 shoelace_arrive.arr_name, shoelace_arrive.arr_quant를 선택하십시오 shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok;
이제 첫 번째 스포츠 토토Shoelace_ok_ins
가 적용되어 다음을 다음과 같이 바꿉니다.
Shoelace 업데이트 sl_avail = shoelace.sl_avail + shoelace_arrive.arr_quant를 설정합니다 shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok, Shoelace_ok Old, Shoelace_ok New, 신발 끈 여기서 shoelace.sl_name = shoelace_arrive.arr_name;
그리고 원본을 버립니다삽입
onShoelace_ok
. 이 다시 작성된 쿼리가 다시 스포츠 토토 시스템으로 전달되고 두 번째로 적용되는 스포츠 토토Shoelace_upd
생산 :
Shoelace_Data를 업데이트하십시오 SL_NAME = shoelace.sl_name을 설정합니다. sl_avail = shoelace.sl_avail + shoelace_arrive.arr_quant, sl_color = shoelace.sl_color, sl_len = shoelace.sl_len, sl_unit = shoelace.sl_unit shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok, Shoelace_ok Old, Shoelace_ok New, 신발 끈, 구두 끈으로, Shoelace new, shoelace_data shoelace_data 여기서 shoelace.sl_name = shoelace_arrive.arr_name 및 shoelace_data.sl_name = shoelace.sl_name;
다시대신
규칙 및 이전 쿼리 트리가 쓰레기가 져 있습니다. 이 쿼리는 여전히보기를 사용합니다Shoelace
. 그러나 스포츠 토토 시스템은이 단계로 완료되지 않았으므로 계속되고를 적용합니다._return
스포츠 토토에 따라 :.
Shoelace_Data를 업데이트하십시오 SL_NAME = S.SL_NAME 설정 sl_avail = s.sl_avail + shoelace_arrive.arr_quant, sl_color = s.sl_color, sl_len = s.sl_len, sl_unit = s.sl_unit shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok, Shoelace_ok Old, Shoelace_ok New, 신발 끈, 구두 끈으로, Shoelace new, shoelace_data shoelace_data, 신발 끈 오래, 신발 끈 새, shoelace_data s, 단위 u 여기서 s.sl_name = shoelace_arrive.arr_name 및 shoelace_data.sl_name = s.sl_name;
마지막으로, 스포츠 토토log_shoelace
추가 쿼리 트리 생성 :
shoelace_log에 삽입하십시오 s.sl_name 선택, s.sl_avail + shoelace_arrive.arr_quant, current_user, current_timestamp shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok, Shoelace_ok Old, Shoelace_ok New, 신발 끈, 구두 끈으로, Shoelace new, shoelace_data shoelace_data, 신발 끈 오래, 신발 끈 새, shoelace_data s, Unit U, shoelace_data old, shoelace_data new shoelace_log shoelace_log 여기서 s.sl_name = shoelace_arrive.arr_name 및 shoelace_data.sl_name = s.sl_name 그리고 (s.sl_avail + shoelace_arrive.arr_quant) < s.sl_avail;
그 후 규칙 시스템은 규칙이 부족하여 생성 된 쿼리 트리를 반환합니다.
그래서 우리는 두 개의 최종 쿼리 트리로 끝납니다.SQL진술 :
shoelace_log에 삽입하십시오 s.sl_name 선택, s.sl_avail + shoelace_arrive.arr_quant, current_user, current_timestamp shoelace_arrive shoelace_arrive, shoelace_data shoelace_data, shoelace_data s 여기서 s.sl_name = shoelace_arrive.arr_name 및 shoelace_data.sl_name = s.sl_name 및 s.sl_avail + shoelace_arrive.arr_quant < s.sl_avail; Shoelace_data를 업데이트하십시오 sl_avail = shoelace_data.sl_avail + shoelace_arrive.arr_quant를 설정합니다 shoelace_arrive에서 shoelace_arrive, shoelace_data shoelace_data, shoelace_data s 여기서 s.sl_name = shoelace_arrive.sl_name 및 shoelace_data.sl_name = s.sl_name;
결과는 한 관계에서 다른 관계에서 나오는 데이터가 다른 관계에 삽입되어 3 분의 1의 업데이트로 변경되었으며, 네 번째 플러스 업데이트로 변경되어 5 분의 1의 최종 업데이트가 두 쿼리로 축소되었습니다..
약간 추악한 세부 사항이 있습니다. 두 쿼리를 살펴보면Shoelace_data
관계는 범위 테이블에 두 번 나타나서 확실히 하나로 줄일 수 있습니다. 플래너는이를 처리하지 않으므로 규칙 시스템 출력에 대한 실행 계획삽입
중첩 루프 - 합병 조인 - SEQ 스캔 - 정렬 - seq scan on s - SEQ 스캔 - 정렬 - shoelace_arrive에서 seq 스캔 - SHOELACE_DATA에서 SEQ 스캔
추가 범위 테이블 항목을 생략하면
합병 조인 - SEQ 스캔 - 정렬 - seq scan on s - SEQ 스캔 - 정렬 - SHOELACE_ARRIVE에서 SEQ 스캔
로그 테이블에서 정확히 동일한 항목을 생성합니다. 따라서 규칙 시스템은 테이블에서 하나의 추가 스캔을 일으켰습니다.Shoelace_data
그것은 절대 필요하지 않습니다. 그리고 동일한 중복 스캔이에서 다시 한 번 수행됩니다.업데이트
. 그러나 모든 것을 가능하게하는 것은 정말 어려운 일이었습니다.
이제 우리는의 최종 데모를 만듭니다.PostgreSQL규칙 시스템과 그 전력. 데이터베이스에 특별한 색상의 신발 끈을 추가한다고 가정 해 봅시다 :
Shoelace 값에 삽입 ( 'sl9', 0, '핑크', 35.0, '인치', 0.0); 신발 값 값 ( 'SL10', 1000, 'Magenta', 40.0, 'inch', 0.0)에 삽입
우리는 어느 것을 확인하고 싶습니다Shoelace
항목은 신발에 맞지 않습니다. 이것에 대한 견해는 다음과 같습니다.
보기 Shoelace_mistatch ar 존재하지 않는 곳에 * Shoelace에서 *를 선택하십시오 (slcolor = sl_color 인 Shoe에서 Shoename을 선택하십시오);
출력은 다음과 같습니다.
SHOELACE_MISTACTH에서 선택 *; sl_name | SL_AVAIL | SL_COLOR | SL_LEN | SL_UNIT | SL_LEN_CM ---------+----------+----------+-------+-------------------------------------- SL9 | 0 | 핑크 | 35 | 인치 | 88.9 SL10 | 1000 | 마젠타 | 40 | 인치 | 101.6
41081_41222PostgreSQL, 직접 삭제하지 않습니다. 대신 우리는 하나 더보기를 만듭니다 :
view shoelace_can_delete as as shoelace_mistatch에서 * sel_avail = 0;에서 선택하십시오.
이런 식으로 수행하십시오 :
존재하는 곳에서 Shoelace에서 삭제합니다 (SHOELACE_CAN_DELETE에서 * 선택하십시오 여기서 sl_name = shoelace.sl_name);
Voilà:
SELECT * FROM SHOELACE; sl_name | SL_AVAIL | SL_COLOR | SL_LEN | SL_UNIT | 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 | m | 100 SL6 | 20 | 브라운 | 0.9 | m | 90 (9 줄)
a삭제
보기에서, 총 4 개의 중첩/결합 된 뷰를 사용하는 하위 쿼리 자격을 갖추면, 그 중 하나 자체가 뷰가 포함 된 하위 쿼리 자격을 가지고 있고 계산 된 뷰 열이 사용되는 단일 쿼리 트리로 다시 쓰여 실제 테이블에서 요청 된 데이터를 삭제합니다.
그러한 구성이 필요한 실제 세계에는 몇 가지 상황이있을 것입니다. 그러나 그것은 당신이 그것이 효과가 있다는 느낌을줍니다.
올바르지 않은 문서에 아무것도 표시되면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면