INSERT, UPDATE 및 DELETE에 정의된 규칙은 완전히 이전 섹션에서 설명한 보기 규칙과 다릅니다. 첫째, CREATE RULE 명령은 더 많은 것을 허용합니다.
그들은 아무 조치도 취할 수 없습니다.
그들은 여러 가지 행동을 가질 수 있습니다.
INSTEAD 키워드는 선택사항입니다.
의사 관계 NEW 및 OLD가 유용해집니다.
그들은 토토 꽁 머니 제한을 가질 수 있습니다.
구문을 유지하세요
CREATE RULE rule_name AS ON 이벤트
TO 객체 [WHERE 토토 꽁 머니_자격]
DO [대신] [작업 | (행동) | 아무것도 아님];생각해 보세요. 다음에서 "업데이트 규칙"은 다음과 같은 규칙을 의미합니다.
INSERT, UPDATE 또는 DELETE 시 정의됩니다.업데이트 토토 꽁 머니은 결과가 나올 때 토토 꽁 머니 시스템에 의해 적용됩니다. 구문 분석 트리의 관계 및 명령 유형이 객체와 동일합니다. CREATE RULE 명령에 제공된 이벤트. 업데이트 토토 꽁 머니의 경우 토토 꽁 머니 시스템은 구문 분석 트리 목록을 생성합니다. 처음에는 파스트리 목록이 비어 있습니다. 0(NOTHING 키워드), 하나 또는 여러 개가 있을 수 있습니다. 행위. 단순화하기 위해 하나의 작업이 포함된 토토 꽁 머니을 살펴보겠습니다. 이 토토 꽁 머니 자격이 있을 수도 있고 없을 수도 있고 INSTEAD일 수도 있고 없을 수도 있습니다.
토토 꽁 머니 제한이란 무엇입니까? 제한사항을 알려주는 내용입니다 토토 꽁 머니의 작업을 수행해야 하는 경우와 수행하지 않는 경우. 이것 자격은 NEW 및/또는 OLD 의사만 참조할 수 있습니다. 기본적으로 대상으로 주어진 관계인 관계(그러나 특별한 의미로).
그래서 우리는 다음에 대한 구문 분석 트리를 생성하는 네 가지 경우가 있습니다. 일회성 규칙입니다.
자격이 없고 대신하지 않음:
원본이 있는 토토 꽁 머니 작업의 구문 분석 트리 Parsetrees 자격이 추가되었습니다.
자격은 없지만 대신:
원본이 있는 토토 꽁 머니 작업의 구문 분석 트리 Parsetrees 자격이 추가되었습니다.
자격이 부여되었으나 대신 제공되지 않음:
토토 꽁 머니이 실행되는 토토 꽁 머니 작업의 구문 분석 트리 자격 및 원래 파스트리 자격 추가되었습니다.
자격 부여 및 대신:
토토 꽁 머니이 실행되는 토토 꽁 머니 작업의 구문 분석 트리 자격 및 원래 파스트리 자격 추가되었습니다.
부정된 토토 꽁 머니이 있는 원래 구문 분석 트리 자격이 추가되었습니다.
마지막으로 토토 꽁 머니이 INSTEAD가 아닌 경우 변경되지 않은 원본 구문 분석 트리가 목록에 추가됩니다. 자격을 갖춘 INSTEAD 토토 꽁 머니만 있기 때문에 이미 원본 구문 분석 트리를 추가하면 총 최대값이 발생합니다. 하나의 작업이 있는 토토 꽁 머니에 대한 두 개의 구문 분석 트리 중
규칙 작업에서 생성된 구문 분석 트리는 시스템을 다시 작성하면 더 많은 규칙이 적용될 수 있습니다. 다소간 파스트리. 따라서 규칙 작업의 구문 분석 트리는 다음과 같아야 합니다. 다른 명령 유형이나 다른 결과 관계가 있습니다. 그렇지 않으면 이 재귀 프로세스가 루프에 빠지게 됩니다. 있다 현재 10회 반복의 재귀 제한으로 컴파일되었습니다. 10시 이후라면 반복 중에 규칙 시스템을 적용하기 위한 업데이트 규칙이 여전히 있습니다. 여러 규칙 정의에 대한 루프를 가정하고 중단합니다. 거래.
의 작업에서 발견된 구문 분석 트리pg_rewrite시스템 카탈로그는 단지 템플릿일 뿐입니다. 부터 NEW 및 OLD에 대한 범위 테이블 항목을 참조할 수 있습니다. 대체는 사용하기 전에 이루어져야 합니다. 누구에게나 NEW를 참조하면 원래 쿼리의 대상 목록이 검색됩니다. 해당 항목에 대해. 발견된 경우 해당 항목 표현식은 다음과 같습니다. 참조에 넣었습니다. 그렇지 않으면 NEW는 OLD와 동일함을 의미합니다. 어느 OLD에 대한 참조는 범위 테이블 항목에 대한 참조로 대체됩니다. 이것이 결과관계입니다.
우리는 sl_avail 열의 변경 사항을 추적하고 싶습니다.신발끈_데이터관계. 그래서 우리는 로그를 설정했습니다 매번 항목을 작성하는 테이블과 토토 꽁 머니이 있으며 UPDATE는 수행 날짜:신발끈_데이터.
CREATE TABLE 신발끈_로그(
sl_name char(10), -- 신발끈 변경됨
sl_avail 정수, -- 새로운 사용 가능한 값
log_who 이름, -- 누가 그랬나요?
log_when 날짜/시간 - 언제
);
신발끈_데이터 업데이트 시 log_shoelace 규칙 생성
NEW.sl_avail != OLD.sl_avail 위치
신발끈_로그 값(
NEW.sl_name,
NEW.sl_avail,
getpusername(),
'지금'::텍스트
);흥미로운 세부사항 중 하나는 규칙에 '지금'을 캐스팅하는 것입니다.
텍스트를 입력하려면 INSERT 작업을 수행하세요. 그것이 없으면 파서는 다음을 볼 것입니다.
CREATE RULE 시간, 대상 유형신발끈_로그은 날짜/시간이고 다음을 만들려고 합니다.
그것으로부터 일정합니다 - 성공했습니다. 따라서 일정한 날짜/시간 값은
규칙 작업에 저장되며 모든 로그 항목에는
CREATE RULE 문의 시간입니다. 정확히 우리가 원하는 것은 아닙니다. 그만큼
캐스팅으로 인해 파서가 datetime('now'::text) 을 구성합니다.
규칙이 실행될 때 평가됩니다.이제 알은 그렇습니다
al_bundy= 업데이트 신발끈_데이터 설정 sl_avail = 6
al_bundy- sl_name = 'sl7';그리고 우리는 로그 테이블을 봅니다.al_bundy= SELECT * FROM shoelace_log;
sl_name |sl_avail|log_who|log_when
--------+---------+---------+-------------------
sl7 | 6|Al |10월 20일 화요일 16:14:45 1998년 MET DST
(1행)그것이 우리가 기대했던 것입니다. 그 배경에서 일어난 일은
다음. 파서는 파서 트리를 생성했습니다(이번에는
원래 구문 분석 트리의 일부는 강조 표시됩니다.
작업은 업데이트 규칙에 대한 규칙 작업입니다.
UPDATE 신발끈_데이터 세트 sl_avail = 6
FROM 신발끈_데이터 신발끈_데이터
WHERE bpchareq(shoelace_data.sl_name, 'sl7');
다음과 함께 업데이트 중인 'log_shoelace' 규칙이 있습니다.
규칙 한정 표현식int4ne(NEW.sl_avail, OLD.sl_avail)그리고 하나의 작업
신발끈_로그에 삽입 선택
*NEW*.sl_name, *NEW*.sl_avail,
getpgusername(), datetime('now'::text)
FROM 신발끈_데이터 *NEW*, 신발끈_데이터 *OLD*,
신발끈_로그 신발끈_로그;pg_rules 시스템 보기의 출력을 신뢰하지 마십시오. 그것
참조만 있는 상황을 특별히 처리합니다.
INSERT에 NEW 및 OLD가 포함되어 있으며 INSERT의 VALUES 형식을 출력합니다.
실제로 INSERT ... VALUES와 INSERT ... VALUES 사이에는 차이가 없습니다.
INSERT ... 구문 분석 수준에서 선택합니다. 둘 다 범위 테이블을 갖고 있고,
목표 목록 및 어쩌면 자격 등. 나중에 최적화 프로그램
결과 유형 seqscan의 실행 계획을 생성할지 여부를 결정합니다.
indexscan, Join 또는 해당 구문 분석 트리에 대한 모든 것. 없는 경우
구문 분석 트리에 남아 있는 범위 테이블 항목에 대한 참조는 다음과 같습니다.
결과 실행 계획(INSERT ... VALUES 버전) 규칙
위의 조치로 인해 실제로 두 가지 변형이 모두 발생할 수 있습니다.토토 꽁 머니은 정규화된 비INSTEAD 토토 꽁 머니이므로 토토 꽁 머니 시스템은 두 개의 구문 분석 트리를 반환합니다. 수정된 토토 꽁 머니 작업과 원본 파스트리. 첫 번째 단계에서는 원래 쿼리의 범위 테이블 토토 꽁 머니 작업 구문 분석 트리에 통합됩니다. 이 결과 안에
신발끈_로그에 삽입 선택
*NEW*.sl_name, *NEW*.sl_avai,
getpgusername(), datetime('now'::text)
에서신발끈_데이터 신발끈_데이터, 신발끈_데이터 *NEW*,
신발끈_데이터 *OLD*, 신발끈_로그 신발끈_로그;2단계에서는 토토 꽁 머니 제한이 추가되므로
결과 집합은 sl_avail이 변경되는 행으로 제한됩니다.신발끈_로그에 삽입 선택
*NEW*.sl_name, *NEW*.sl_avai,
getpgusername(), datetime('now'::text)
FROM 신발끈_데이터 신발끈_데이터, 신발끈_데이터 *NEW*,
신발끈_데이터 *OLD*, 신발끈_로그 신발끈_로그어디 int4ne(*NEW*.sl_avail, *OLD*.sl_avail);
3단계에서는 원래의 구문 분석 트리 자격이 추가됩니다.
결과 집합을 다음이 터치한 행으로만 추가로 제한합니다.
원래 구문 분석 트리.신발끈_로그에 삽입 선택
*NEW*.sl_name, *NEW*.sl_avai,
getpgusername(), datetime('now'::text)
FROM 신발끈_데이터 신발끈_데이터, 신발끈_데이터 *NEW*,
신발끈_데이터 *OLD*, 신발끈_로그 신발끈_로그
WHERE int4ne(*NEW*.sl_avail, *OLD*.sl_avail)AND bpchareq(신발끈_data.sl_name, 'sl7');
4단계는 새 참조를 대상 목록 항목으로 대체합니다.
원래 구문 분석 트리에서 또는 일치하는 변수를 사용하여
결과 관계의 참조입니다.신발끈_로그에 삽입 SELECT신발끈_데이터.sl_name, 6,
getpgusername(), datetime('now'::text)
FROM 신발끈_데이터 신발끈_데이터, 신발끈_데이터 *NEW*,
신발끈_데이터 *OLD*, 신발끈_로그 신발끈_로그
어디에서 int4ne(6, *OLD*.sl_avail)
AND bpchareq(신발끈_데이터.sl_name, 'sl7');5단계는 이전 참조를 결과 관계로 대체합니다.
참조.신발끈_로그에 삽입 선택
신발끈_데이터.sl_name, 6,
getpgusername(), datetime('now'::text)
FROM 신발끈_데이터 신발끈_데이터, 신발끈_데이터 *NEW*,
신발끈_데이터 *OLD*, 신발끈_로그 신발끈_로그
여기서 int4ne(6,신발끈_data.sl_avail)
AND bpchareq(신발끈_데이터.sl_name, 'sl7');그렇습니다. 따라서 토토 꽁 머니의 수익을 최대로 줄였습니다.
system은 동일한 두 개의 구문 분석 트리 목록입니다.
진술:신발끈_로그에 삽입 선택
신발끈_데이터.sl_name, 6,
getpgusername(), '지금'
신발끈_데이터에서
어디에 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은 다음으로 대체됩니다.
shoelace_data.sl_avail로 인해 추가 쿼리가 발생함신발끈_로그에 삽입 선택
신발끈_데이터.sl_name,신발끈_data.sl_avail,
getpgusername(), '지금'
신발끈_데이터에서
어디신발끈_data.sl_avail!= shoelace_data.sl_avail
AND 신발끈_데이터.sl_name = 'sl7';그리고 그 자격은 결코 사실이 아닐 것입니다. 아니기 때문에
INSERT ... SELECT 사이의 구문 분석 트리 수준 차이
INSERT ... VALUES, 원래 쿼리가 수정되는 경우에도 작동합니다.
여러 행. 따라서 Al이 명령을 내리면신발끈_데이터 설정 sl_avail = 0 업데이트
sl_color = '검은색';사실 4개의 행이 업데이트됩니다(sl1, sl2, sl3 및 sl4). 하지만
sl3에는 이미 sl_avail = 0이 있습니다. 이번에는 원래 구문 분석 트리가
자격이 다르므로 추가 구문 분석 트리가 생성됩니다.신발끈_로그에 삽입 선택
신발끈_데이터.sl_name, 0,
getpgusername(), '지금'
신발끈_데이터에서
어디에 0 != shoelace_data.sl_avail
그리고신발끈_data.sl_color = '검은색';
이 구문 분석 트리는 반드시 세 개의 새로운 로그 항목을 삽입할 것입니다. 그리고
정말 맞습니다.원본 구문 분석 트리가 마지막에 실행되는 것이 중요합니다. 그만큼포스트그레"교통경찰"은 다음과 같은 일을 합니다 두 실행 사이의 명령 카운터 증가 두 번째 항목이 첫 번째 항목의 변경 사항을 볼 수 있도록 구문 분석 트리를 사용합니다. 만약에 UPDATE가 먼저 실행되었을 것이고 모든 행이 이미 실행되었습니다. 0으로 설정하면 로깅 INSERT가 0인 행을 찾지 못하게 됩니다. != 신발끈_데이터.sl_avail.
언급된 항목으로부터 뷰 관계를 보호하는 간단한 방법 누군가가 INSERT, UPDATE, DELETE를 눈에 보이지 않게 할 수 있는 가능성 그에 대한 데이터는 해당 구문 분석 트리가 버려지도록 하는 것입니다. 우리는 창조한다 토토 꽁 머니
신발에 삽입할 때 shoe_ins_protect 토토 꽁 머니 생성
대신 아무것도 하지 마십시오.
신발 업데이트 시 shoe_upd_protect 토토 꽁 머니 생성
대신 아무것도 하지 마십시오.
신발 삭제 시 shoe_del_protect 토토 꽁 머니 생성
대신 아무것도 하지 마십시오.Al이 이제 뷰에서 이러한 작업을 수행하려고 시도하면
관계신발, 토토 꽁 머니 시스템이 적용됩니다
토토 꽁 머니. 토토 꽁 머니에는 작업이 없고 INSTEAD이므로
결과 구문 분석 트리 목록은 비어 있고 전체 쿼리는
최적화할 것이 아무것도 남지 않았기 때문에 아무 것도 되지 않거나
토토 꽁 머니 시스템이 완료된 후에 실행됩니다.참고:이 사실은 프론트엔드 애플리케이션을 짜증나게 할 수 있습니다 데이터베이스에는 아무 일도 일어나지 않았기 때문에 백엔드는 쿼리에 대해 아무것도 반환하지 않습니다. 심지어 PGRES_EMPTY_QUERY 정도는 libpq에서 사용할 수 있습니다. psql에서는, 아무 일도 일어나지 않습니다. 이는 향후 변경될 수 있습니다.
규칙 시스템을 사용하는 보다 정교한 방법은 다음을 만드는 것입니다. 구문 분석 트리를 올바른 구문 분석 트리로 다시 작성하는 규칙 실제 테이블에서의 작업. 그렇게 하려면신발끈보기, 우리는 다음 규칙을 만듭니다:
신발끈에 삽입할 때와 같이 신발끈_인 규칙을 생성하세요.
대신에
신발끈_데이터 값에 삽입(
NEW.sl_name,
NEW.sl_avail,
NEW.sl_color,
NEW.sl_len,
NEW.sl_unit);
신발끈 업데이트 시 규칙 shoelace_upd 생성
대신에
신발끈_데이터 세트 업데이트
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;이제 알의 가게에 신발끈 한 뭉치가 도착하고 있습니다.
큰 부분 목록이 있습니다. 알은 계산을 잘 못해서 우리는
신발끈 보기를 수동으로 업데이트하는 것을 원하지 않습니다. 대신에 우리는
두 개의 작은 테이블을 설치하고, 그 중 하나는 그가 항목을 삽입할 수 있는 테이블입니다.
부품 목록과 특별한 트릭이 있는 부품 목록입니다. 다음에 대한 생성 명령
무엇이든:CREATE TABLE 신발끈_도착(
arr_name 문자(10),
arr_퀀트 정수
);
CREATE TABLE 신발끈_확인(
ok_name 문자(10),
ok_Quant 정수
);
shoelace_ok에 삽입할 때와 같이 shoelace_ok_ins 규칙을 생성합니다.
대신에
UPDATE 신발끈 세트
sl_avail = sl_avail + NEW.ok_Quant
sl_name = NEW.ok_name;이제 알은 앉아서 무엇이든 할 수 있습니다.al_bundy= SELECT * FROM shoelace_arrive;
arr_name |arr_Quant
----------+---------
sl3 | 10
sl6 | 20
sl8 | 20
(3행)정확히 부품 목록에 있는 내용입니다. 우리는 빨리 살펴 본다
현재 데이터에서,al_bundy= SELECT * FROM 신발끈 ORDER BY sl_name;
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|분 | 100
sl6 | 0|갈색 | 0.9|분 | 90
(8행)도착된 신발끈을 안으로 넣으세요al_bundy= 신발끈_ok에 삽입 SELECT * FROM 신발끈_arrive;그리고 결과를 확인하세요
al_bundy= SELECT * FROM 신발끈 ORDER BY sl_name;
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|분 | 100
sl6 | 20|갈색 | 0.9|분 | 90
(8열)
al_bundy= SELECT * 신발끈_로그에서;
sl_name |sl_avail|log_who|log_when
-----------+---------+---------+-------------------
sl7 | 6|Al |10월 20일 화요일 19:14:45 1998년 MET DST
sl3 | 10|Al |10월 20일 화요일 19:25:16 1998년 MET DST
sl6 | 20|Al |10월 20일 화요일 19:25:16 1998년 MET DST
sl8 | 21|Al |10월 20일 화요일 19:25:16 1998년 MET DST
(4행)INSERT ... SELECT에서 이것들까지 먼 길이 있습니다
결과. 그리고 이에 대한 설명은 이 문서의 마지막이 될 것입니다
(그러나 마지막 예는 아닙니다 :-). 먼저 파서 출력이 있었습니다.신발끈에 삽입_ok 선택
신발끈_도착.arr_name, 신발끈_도착.arr_Quant
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인;이제 첫 번째 토토 꽁 머니 'shoelace_ok_ins'이 적용되어 회전됩니다.
안으로신발끈 세트 업데이트
sl_avail = int4pl(shoelace.sl_avail, shoelace_arrive.arr_Quant)
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_확인 *오래됨*, 신발끈_확인 *신규*,
신발끈 신발끈
WHERE bpchareq(신발끈.sl_name, showlace_arrive.arr_name);그리고 원래 INSERT를 버립니다신발끈_ok. 이 다시 작성된 쿼리는
다시 토토 꽁 머니 시스템을 적용하고 두 번째로 적용된 토토 꽁 머니 'shoelace_upd'
생산됨신발끈_데이터 세트 업데이트
sl_name = 신발끈.sl_name,
sl_avail = int4pl(shoelace.sl_avail, shoelace_arrive.arr_Quant),
sl_color = 신발끈.sl_color,
sl_len = 신발끈.sl_len,
sl_unit = 신발끈.sl_unit
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_확인 *오래됨*, 신발끈_확인 *신규*,
신발끈 신발끈, 신발끈 *OLD*,
신발끈 *NEW*, 신발끈_데이터 showlace_data
WHERE bpchareq(shoelace.sl_name, showlace_arrive.arr_name)
AND bpchareq(신발끈_데이터.sl_name, 신발끈.sl_name);다시 말하지만 이것은 INSTEAD 규칙이고 이전 구문 분석 트리는 다음과 같습니다.
쓰레기. 이 쿼리 창은 뷰를 사용합니다.신발끈그러나 토토 꽁 머니 시스템은 아직 끝나지 않았습니다
이 루프는 계속해서 '_RETshoelace' 토토 꽁 머니을 적용합니다.
그리고 우리는 얻는다신발끈_데이터 세트 업데이트
sl_name = s.sl_name,
sl_avail = int4pl(s.sl_avail, 신발끈_arrive.arr_Quant),
sl_color = s.sl_color,
sl_len = s.sl_len,
sl_unit = s.sl_unit
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_확인 *오래됨*, 신발끈_확인 *신규*,
신발끈 신발끈, 신발끈 *OLD*,
신발끈 *NEW*, 신발끈_데이터 showlace_data,
신발끈 *오래된*, 신발끈 *새상품*,
신발끈_데이터 s, 단위 u
어디에서 bpchareq(s.sl_name, showlace_arrive.arr_name)
AND bpchareq(신발끈_데이터.sl_name, s.sl_name);다시 업데이트 토토 꽁 머니이 적용되어 바퀴가 회전합니다
계속해서 3번째 재작성 단계에 있습니다. 이번에는 'log_shoelace' 토토 꽁 머니을 따릅니다.
추가 구문 분석 트리를 생성하는 내용이 적용됩니다.신발끈_로그에 삽입 선택
s.sl_이름,
int4pl(s.sl_avail, 신발끈_arrive.arr_Quant),
getpusername(),
날짜시간('지금'::텍스트)
FROM 신발끈_도착 신발끈_도착, 신발끈_확인 신발끈_확인,
신발끈_확인 *오래됨*, 신발끈_확인 *신규*,
신발끈 신발끈, 신발끈 *OLD*,
신발끈 *NEW*, 신발끈_데이터 showlace_data,
신발끈 *오래된*, 신발끈 *새상품*,
신발끈_데이터 s, 단위 u,
신발끈_데이터 *이전*, 신발끈_데이터 *신규*
신발끈_로그 신발끈_로그
어디에서 bpchareq(s.sl_name, showlace_arrive.arr_name)
AND bpchareq(신발끈_데이터.sl_name, s.sl_name);
AND int4ne(int4pl(s.sl_avail, 신발끈_arrive.arr_Quant),
s.sl_avail);그 후 규칙 시스템은 규칙이 부족하고 다음을 반환합니다.
생성된 파스트리. 그래서 우리는 두 개의 최종 구문 분석 트리로 끝납니다.
는SQL문장신발끈_로그에 삽입 선택
s.sl_이름,
s.sl_avail + 신발끈_도착.arr_Quant,
getpusername(),
'지금'
FROM 신발끈_도착 신발끈_도착, 신발끈_데이터 신발끈_데이터,
신발끈_데이터
어디서 s.sl_name = 신발끈_arrive.arr_name
AND 신발끈_데이터.sl_name = s.sl_name
AND s.sl_avail + 신발끈_arrive.arr_Quant != s.sl_avail;
신발끈_데이터 세트 업데이트
sl_avail = 신발끈_data.sl_avail + 신발끈_arrive.arr_Quant
FROM 신발끈_도착 신발끈_도착,
신발끈_데이터 신발끈_데이터,
신발끈_데이터
WHERE s.sl_name = 신발끈_arrive.sl_name
AND 신발끈_데이터.sl_name = s.sl_name;결과적으로 하나의 관계에서 오는 데이터가 삽입되었습니다.
다른 것으로, 세 번째 업데이트로 변경, 다음으로 변경
네 번째 업데이트와 다섯 번째 업데이트의 최종 업데이트에 대한 로깅
두 개의 쿼리로 축소되었습니다.약간 보기 흉한 세부 사항이 있습니다. 둘을 바라보며 쿼리 결과는 다음과 같습니다.신발끈_데이터관계가 확실히 발생할 수 있는 범위 테이블에 두 번 나타납니다. 하나로 줄어들게 됩니다. 옵티마이저는 이를 처리하지 않으므로 INSERT의 토토 꽁 머니 시스템 출력에 대한 실행 계획은 BE
중첩 루프
- 병합 조인
- 서열 스캔
- 정렬
- s의 서열 스캔
- 서열 스캔
- 정렬
- 신발끈_도착 시 서열 스캔
- 신발끈_데이터의 서열 스캔추가 범위 테이블 항목을 생략하면 다음과 같은 결과가 발생합니다.병합 조인
- 서열 스캔
- 정렬
- s의 서열 스캔
- 서열 스캔
- 정렬
- 신발끈_도착 시 서열 스캔로그 관계에서 완전히 동일한 항목을 생성합니다.
따라서 규칙 시스템은 다음에서 한 번의 추가 검사를 발생시켰습니다.신발끈_데이터절대 아닌 관계
필요한. 그리고 동일한 사용되지 않는 검색이 다음에서 다시 한 번 수행됩니다.
업데이트. 하지만 그 모든 것을 가능하게 만드는 것은 정말 힘든 일이었습니다.
모두.최종 시연포스트그레규칙 시스템과 그것이 바로 힘입니다. 있다 신발끈을 파는 귀여운 금발. 그리고 Al이 결코 할 수 없었던 일 그녀는 귀여울 뿐만 아니라 똑똑하기도 합니다. 조금은 너무 똑똑합니다. 그래서 알이 신발끈을 주문하는 일이 가끔 일어난다. 절대 판매 불가합니다. 이번에는 1000켤레를 주문했습니다. 마젠타색 신발끈은 현재 다른 종류가 없기 때문에 하지만 그는 일부를 구매하기로 약속했고 그에 대한 데이터베이스도 준비했습니다. 핑크색.
al_bundy= 신발끈 값에 삽입
al_bundy- ('sl9', 0, '핑크', 35.0, '인치', 0.0);
al_bundy= 신발끈 값에 삽입
al_bundy- ('sl10', 1000, '마젠타', 40.0, '인치', 0.0);이런 일이 자주 일어나기 때문에 우리는 신발끈을 찾아야 합니다
때로는 신발이 전혀 맞지 않는 항목입니다. 우리는 할 수 있었다
매번 복잡한 설명을 사용하거나 뷰를 설정할 수 있습니다.
그것을 위해. 이에 대한 견해는 다음과 같습니다CREATE VIEW 신발끈_구식 AS 보기
SELECT * 존재하지 않는 신발끈에서
(slcolor = sl_color인 신발에서 신발 이름 선택);출력은 다음과 같습니다al_bundy= SELECT * FROM 신발끈_구식;
sl_name |sl_avail|sl_color |sl_len|sl_unit |sl_len_cm
----------+---------+----------+------+---------+---------
sl9 | 0|핑크 | 35|인치 | 88.9
sl10 | 1000|자홍색 | 40|인치 | 101.61000개의 자홍색 신발끈을 얻으려면 Al에게 빚을 져야 합니다.
그것들을 버리면 또 다른 문제가 됩니다. 핑크색 입구 우리는
삭제. 조금 더 어렵게 만들기 위해포스트그레스, 직접 삭제하지는 않습니다. 대신에
뷰를 하나 더 만듭니다CREATE VIEW shoelace_candelete AS 보기
SELECT * FROM shoelace_obsolete WHERE sl_avail = 0;이렇게 하세요:존재하는 신발끈에서 삭제
(SELECT * FROM shoelace_candelete
sl_name = 신발끈.sl_name);짜잔:al_bundy= SELECT * FROM 신발끈;
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|분 | 100
sl6 | 20|갈색 | 0.9|분 | 90
(9행)다음에 있는 하위 선택 제한을 사용하여 보기에 대한 삭제
총 4개의 중첩/결합된 뷰를 사용하며 그 중 하나에는
뷰와 계산된 뷰를 포함하는 하위 선택 제한
열이 사용되면 하나의 단일 구문 분석 트리로 다시 작성됩니다.
실제 테이블에서 요청된 데이터를 삭제합니다.내 생각에는 현실 세계에는 몇 가지 상황만이 있을 뿐입니다. 그러한 구조가 필요한 곳. 하지만 기분이 좋아지네요 작동해서 편해요.
진실은:이것을 하다가 버그를 하나 더 발견했습니다 이 문서를 작성 중입니다. 하지만 그걸 고친 후에 나는 조금 전혀 작동한다는 사실에 놀랐습니다.