이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 39.4. 삽입, 업데이트 및 삭제 토토 핫버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

38.4. 규칙삽입, 업데이트삭제

다음에 정의된 규칙삽입, 업데이트삭제보기와 크게 다릅니다. 이전 섹션에서 설명한 규칙입니다. 첫째, 그들의사설 토토 사이트 생성명령은 더 많은 것을 허용합니다:

  • 그들은 아무런 조치도 취할 수 없습니다.

  • 그들은 여러 가지 활동을 할 수 있습니다.

  • 그들은 그럴 수 있습니다대신또는또한(기본값).

  • 의사관계신규그리고오래된유용해집니다.

  • 그들은 사설 토토 사이트 제한을 가질 수 있습니다.

둘째, 그들은 쿼리 트리를 제자리에서 수정하지 않습니다. 대신 그들은 0개 이상의 새 쿼리 트리를 만들고 원본을 버릴 수 있음 하나.

38.4.1. 어떻게 업데이트 규칙 작업

구문을 유지하십시오:

사설 토토 사이트 생성 [ 또는 교체 ]이름AS ON이벤트받는 사람테이블[ 어디에서조건]
    하세요 [ 또한 | 대신 ]  아무것도 |명령 | ( 명령 ; 명령 ... ) }

생각해 보세요. 다음에서,업데이트 규칙다음에 정의된 규칙을 의미합니다.삽입, 업데이트, 또는삭제.

업데이트 규칙은 결과가 나올 때 규칙 시스템에 의해 적용됩니다. 관계 및 쿼리 트리의 명령 유형은 에 주어진 객체와 이벤트사설 토토 사이트 생성명령. 업데이트 규칙의 경우 규칙 시스템은 쿼리 목록을 생성합니다. 나무. 처음에는 쿼리 트리 목록이 비어 있습니다. 0이 있을 수 있다 (아무것도 없음키워드), 하나 또는 여러 개 행위. 단순화하기 위해 하나의 작업이 포함된 규칙을 살펴보겠습니다. 이것 규칙에는 자격이 있을 수도 있고 없을 수도 있습니다.대신또는또한( 기본).

사설 토토 사이트 제한이란 무엇입니까? 제한사항을 알려주는 내용입니다 사설 토토 사이트의 작업을 수행해야 하는 경우와 수행하지 않는 경우. 이것 자격은 의사 관계만 참조할 수 있습니다.신규및/또는오래된, 기본적으로 객체로 주어진 관계를 표현합니다(그러나 특별한 의미).

따라서 다음 쿼리 트리를 생성하는 세 가지 경우가 있습니다. 단일 작업 규칙의 경우.

자격 없음, 둘 중 하나라도 해당또한또는대신

원래 쿼리가 포함된 사설 토토 사이트 작업의 쿼리 트리 트리의 자격이 추가되었습니다.

자격 부여 및또한

사설 토토 사이트 제한이 있는 사설 토토 사이트 작업의 쿼리 트리 원래 쿼리 트리의 자격이 추가되었습니다.

자격 부여 및대신

규칙 제한이 있는 규칙 작업의 쿼리 트리 원래 쿼리 트리의 자격; 그리고 원래 쿼리 부정 규칙 한정이 추가된 트리

마지막으로 규칙이 다음과 같다면또한, 변경되지 않은 원래 쿼리 트리가 목록에 추가됩니다. 이후로 자격 있는대신규칙은 이미 다음을 추가했습니다. 원래 쿼리 트리에서는 하나 또는 두 개의 출력 쿼리로 끝납니다. 하나의 작업이 있는 규칙의 트리입니다.

삽입 중사설 토토 사이트, 원래 쿼리 (억제되지 않은 경우대신) 완료 규칙에 의해 추가된 작업 전. 이를 통해 작업을 볼 수 있습니다. 삽입된 행. 하지만업데이트 중그리고삭제 중규칙, 원래 쿼리는 다음과 같습니다. 규칙에 의해 추가된 작업 후에 수행됩니다. 이는 다음을 보장합니다. 작업은 업데이트되거나 삭제될 행을 볼 수 있습니다. 그렇지 않으면, 일치하는 행을 찾지 못하기 때문에 작업이 아무 작업도 수행하지 않을 수 있습니다. 그들의 자격.

규칙 작업에서 생성된 쿼리 트리는 시스템을 다시 작성하면 더 많은 규칙이 적용되어 더 많거나 적은 쿼리 트리. 따라서 규칙의 작업에는 다음 중 하나가 있어야 합니다. 규칙과 다른 명령 유형 또는 다른 결과 관계 그렇지 않으면 이 재귀 프로세스가 종료됩니다. 무한 루프. (규칙의 재귀적 확장이 감지되고 오류로 보고되었습니다.)

다음 작업에서 발견된 쿼리 트리pg_rewrite시스템 카탈로그는 템플릿일 뿐입니다. 그들은 다음에 대한 범위 테이블 항목을 참조할 수 있기 때문에신규그리고오래된, 일부 대체는 사용하기 전에 이루어져야 합니다. 누구에게나 참조신규, 대상 목록 원래 쿼리에서 해당 항목이 검색됩니다. 발견되면, 해당 항목의 표현식이 참조를 대체합니다. 그렇지 않으면,신규다음과 같음을 의미함오래된(에 대한업데이트) 또는 null 값으로 대체됨(삽입). 참조오래된다음으로 대체됩니다. 결과 관계인 범위 테이블 항목에 대한 참조입니다.

시스템이 업데이트 규칙 적용을 완료한 후 보기를 적용합니다. 생성된 쿼리 트리에 규칙을 적용합니다. 뷰에 새 업데이트를 삽입할 수 없습니다. 따라서 출력에 업데이트 규칙을 적용할 필요가 없습니다. 재작성 보기.

38.4.1.1. 에이 첫 번째 규칙 단계별

우리가 다음에 대한 변경 사항을 추적하고 싶다고 가정해 보겠습니다.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, sl3sl4). 하지만sl3이미 있습니다sl_avail = 0. 이 경우, 원래 쿼리 트리 자격은 다르며 추가 쿼리 트리가 생성됩니다.

신발끈_로그에 삽입
SELECT 신발끈_데이터.sl_name, 0,
       현재_사용자, 현재_타임스탬프
  신발끈_데이터에서
 WHERE 0 < shoelace_data.sl_avail
   그리고신발끈_data.sl_color = '검은색';

규칙에 의해 생성됩니다. 이 쿼리 트리는 반드시 세 개의 새로운 로그 항목. 그리고 그것은 절대적으로 정확합니다.

여기서 우리는 원래 쿼리 트리가 왜 중요한지 볼 수 있습니다. 마지막으로 실행됩니다. 만약업데이트이었어 먼저 실행되면 모든 행이 이미 0으로 설정되어 있을 것입니다. 그래서 로깅삽입아무것도 찾을 수 없습니다 행 어디에서0 < 신발끈_data.sl_avail.

38.4.2. 뷰와의 협력

언급된 것으로부터 뷰 관계를 보호하는 간단한 방법 누군가가 도망치려고 할 가능성이 있음삽입, 업데이트또는삭제그들은 쿼리 트리를 허용하는 것입니다 버림받다. 따라서 사설 토토 사이트을 만들 수 있습니다.

신발에 삽입할 때 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;

결과는 하나의 관계에서 오는 데이터가 다른 하나는 세 번째 업데이트로 변경되었으며, 업데이트로 변경되었습니다. 네 번째 플러스 5번째의 최종 업데이트가 다음으로 줄어드는 로깅 두 개의 쿼리.

약간 보기 흉한 세부 사항이 있습니다. 둘을 바라보며 쿼리를 수행한 결과 다음과 같은 결과가 나왔습니다.신발끈_데이터관계가 범위에 두 번 나타납니다. 확실히 하나로 줄일 수 있는 테이블입니다. 기획자가 하는 일 이를 처리하지 않으므로 규칙 시스템 출력에 대한 실행 계획 의삽입될 것이다

중첩 루프
  - 병합 조인
        - 서열 스캔
              - 정렬
                    - s의 서열 스캔
        - 서열 스캔
              - 정렬
                    - 신발끈_도착 시 서열 스캔
  - 신발끈_데이터의 서열 스캔

추가 범위 테이블 항목을 생략하면 다음과 같은 결과가 발생합니다.

병합 조인
  - 서열 스캔
        - 정렬
              - s의 서열 스캔
  - 서열 스캔
        - 정렬
              - 신발끈_도착 시 서열 스캔

로그 테이블에 정확히 동일한 항목이 생성됩니다. 따라서, 규칙 시스템으로 인해 테이블에 대한 추가 스캔이 발생했습니다.신발끈_데이터절대 필요하지 않습니다. 그리고 동일한 중복 검색이 한 번 더 수행됩니다.업데이트. 그런데 그걸 만드는 게 정말 힘들었어요. 모두 가능합니다.

이제 우리는 마지막 시연을 보여줍니다.PostgreSQL규칙 시스템과 그 힘. 당신이라고 말해요 특별한 색상의 신발끈을 데이터베이스에 추가하세요.

신발끈 값에 삽입('sl9', 0, '핑크', 35.0, '인치', 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개의 중첩/결합된 뷰를 사용하는 자격입니다. 그 자체에는 뷰와 계산된 뷰 열이 사용되는 경우 하나로 다시 작성됩니다. 실제 쿼리에서 요청된 데이터를 삭제하는 단일 쿼리 트리 테이블.

실제 세계에는 아마도 몇 가지 상황만 있을 것입니다. 그러한 구조가 필요한 곳. 하지만 그것은 당신을 느끼게 해준다 작동해서 편해요.