이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

삽입 스포츠 토토 결과, 업데이트 및 삭제

차이점 스포츠 토토 결과보기

삽입, 업데이트 및 삭제에 정의 된 규칙은 완전히입니다. 이전 섹션에 설명 된보기 규칙과 다릅니다. 첫째, 그들의 규칙 작성 명령은 더 많은 것을 허용합니다 :

  • 아무런 조치도 취하지 않을 수 있습니다.

  • 여러 행동을 할 수 있습니다.

  • 키워드는 대신 선택 사항입니다.

  • 의사 관계 새롭고 오래된 관계가 유용 해집니다.

  • 스포츠 토토 결과 자격을 가질 수 있습니다.

둘째, 파트 세트를 수정하지 않습니다. 대신 그들은 0 또는 많은 새로운 parsetrees를 만들고 원본을 버릴 수 있습니다. 하나.

이 스포츠 토토 결과 방법 일하다

구문 유지

이벤트에서 Rule Rule_Name을 만듭니다
        반대하기 [rule_qualification]
        [대신] [행동 | (행동) | 아무것도 아님];
염두에 두십시오. 다음에서 "업데이트 규칙"은 규칙을 의미합니다 삽입, 업데이트 또는 삭제에 정의됩니다.

업데이트 스포츠 토토 결과은 결과가 발생할 때 스포츠 토토 결과 시스템에 적용됩니다. Parsetree의 관계 및 명령 유형은 객체와 같습니다. 그리고 Create Rule 명령에 제공된 이벤트. 업데이트 스포츠 토토 결과의 경우 스포츠 토토 결과 시스템은 ParsetRees 목록을 만듭니다. 초기에 파 세트 목록이 비어 있습니다. 0 (키워드 없음), 하나 또는 여러 가지가있을 수 있습니다 행위. 단순화하기 위해, 우리는 한 가지 행동이있는 스포츠 토토 결과을 살펴 봅니다. 이 스포츠 토토 결과 자격을 가질 수 있고 대신 할 수 있습니다.

스포츠 토토 결과 자격이란 무엇입니까? 그것은 제한이라는 제한입니다 스포츠 토토 결과의 행동이 수행되어야하는 경우와 그렇지 않은 경우. 이것 자격은 신규 및/또는 오래된 의사만을 참조 할 수 있습니다 기본적으로 객체로 주어진 관계 (그러나 특별한 의미로).

그래서 우리는 다음과 같은 Parsetrees를 생성하는 4 가지 사례가 있습니다. 일회용 규칙.

  • 자격이없고 대신 아님 :

    • 원본이있는 스포츠 토토 결과 조치에서 파트 세트 ParsetRees 자격이 추가되었습니다.

  • 자격이 없지만 대신 :

    • 원본이있는 스포츠 토토 결과 동작의 파 세트 ParsetRees 자격이 추가되었습니다.

  • 대신 자격이 제공되지 않습니다 :

    • 스포츠 토토 결과이있는 스포츠 토토 결과 조치에서 파트 세트 자격 및 원래 ParsetRees 자격 추가되었습니다.

  • 자격 제공 및 대신 :

    • 스포츠 토토 결과이있는 스포츠 토토 결과 조치에서 파트 세트 자격 및 원래 ParsetRees 자격 추가되었습니다.

    • 부정적인 스포츠 토토 결과이있는 원래의 파 세트 자격이 추가되었습니다.

마지막으로, 스포츠 토토 결과이 대신에 있지 않으면 변하지 않은 원본 Parsetree가 목록에 추가됩니다. 대신 자격을 갖추었기 때문에 이미 원래의 Parsetree를 추가하고 총 최대 값으로 끝납니다. 한 번의 행동을 가진 스포츠 토토 결과에 대한 두 개의 parsetrees.

규칙 동작에서 생성 된 ParsetRees는 시스템을 다시 작성하면 더 많은 규칙이 적용되어 다소 parsetrees. 따라서 규칙 조치의 파 세트는해야합니다 다른 CommandType 또는 다른 결과가 있습니다. 그렇지 않으면이 재귀 프로세스는 루프로 끝납니다. A가 있습니다 현재 10 회 반복의 재귀 한계로 컴파일되었습니다. 10시 이후 반복 규칙 시스템을 적용하기위한 업데이트 규칙이 여전히 있습니다. 여러 규칙 정의에 대한 루프를 가정하고 거래.

pg_rewrite시스템 카탈로그는 단지 템플릿입니다. 부터 그들은 새롭고 오래된 항목을 참조 할 수 있습니다. 사용하기 전에 대체해야합니다. 어떤 것도 New에 대한 참조, 원래 쿼리의 대상 목록이 검색됩니다. 해당 항목의 경우. 발견된다면, 그 항목 표현은입니다 참조에 배치. 그렇지 않으면 새로운 것은 오래된 것과 동일하다는 것을 의미합니다. 어느 Old에 대한 참조는 Rangetable 항목에 대한 참조로 대체됩니다. 그것은 결함입니다.

첫 번째 스포츠 토토 결과 단계별

우리는의 SL_AVAIL 열을 추적하고 싶습니다shoelace_data관계. 그래서 우리는 로그를 설정합니다 테이블과 우리에게 매번 항목을 작성하고 업데이트하는 규칙은 다음과 같습니다. 수행Shoelace_data.

테이블 생성 shoelace_log (
        SL_NAME char (10), -Hoelace가 변경되었습니다
        SL_AVAIL INTEGER - 새로운 가용 값
        log_who 이름 - 누가 그랬습니다
        log_hen dateTime 시절 - 언제
    );

    shoelace_data에 대한 업데이트시 규칙 log_shoelace를 만듭니다
        어디서 New.sl_avail! = old.sl_avail
        shoelace_log 값에 삽입하십시오 (
                                        new.sl_name,
                                        new.sl_avail,
                                        getpgusername (),
                                        '지금':: 텍스트
                                    );
흥미로운 세부 사항 중 하나는 스포츠 토토 결과에서 'Now'의 캐스팅입니다. 텍스트를 입력하려면 조치를 삽입하십시오. 그 없이는 파서가 볼 것입니다 스포츠 토토 결과 시간을 만듭니다. 대상 유형 inshoelace_log는 DateTime이며 a를 만들려고합니다 그것으로부터 일정 - 성공과 함께. 따라서 일정한 DateTime 값이 될 것입니다 스포츠 토토 결과 조치에 저장되며 모든 로그 항목은 스포츠 토토 결과을 작성하는 시간. 우리가 원하는 것이 아닙니다. 그만큼 캐스팅은 파서가 dateTime을 구성합니다 ( 'now':: text) 그것으로부터 이것은 스포츠 토토 결과이 실행될 때 평가 될 것입니다.

지금 al

al_bundy = 업데이트 shoelace_data set 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 | tue 10 월 20 일 16:14:45 1998 Met Dst
    (1 행)
그것이 우리가 기대했던 것입니다. 백그라운드에서 일어난 일은 다음. 파서는 파 세트를 만들었습니다 (이번에는 원래 파 세트의 일부는 작업은 업데이트 규칙의 규칙 조치입니다).
    Shoelace_Data 업데이트 SL_AVAIL = 6
      Shoelace_data에서 Shoelace_data에서
     여기서 bpchareq (shoelace_data.sl_name, 'sl7');
스포츠 토토 결과 'log_shoelace'가 있습니다. 스포츠 토토 결과 자격 표현
int4ne (new.sl_avail, old.sl_avail)
및 하나의 행동
shoelace_log에 삽입 
           *새*.sl_name,*new*.sl_avail,
           getpgusername (), dateTime ( 'now':: text)
      shoelace_data *new *, shoelace_data *old *,
           shoelace_log shoelace_log;
PG_RULES 시스템보기의 출력을 신뢰하지 마십시오. 그것 특별히 언급 만있는 상황을 처리합니다. 인서트의 새롭고 오래된 인서트의 값 형식을 삽입하고 출력합니다. 실제로 인서트 ... 값과 삽입 ... 파 세트 레벨에서 선택하십시오. 그들은 둘 다 rangetables를 가지고 있습니다. TargetList 및 자격 등. 나중에 Optimizer 유형 결과의 실행 계획을 작성하려면 seqscan, Indexscan, 가입 또는 그 파트 세트에 대한 무엇이든. 없다면 파트 세트를 떠난 rangetable 항목에 대한 언급은 결과 실행 계획 (삽입 ... 값 버전). 스포츠 토토 결과 위의 조치는 두 변형을 진정으로 초래할 수 있습니다.

스포츠 토토 결과은 자격을 갖춘 비 입동 스포츠 토토 결과이므로 스포츠 토토 결과 시스템에는 두 개의 parsetrees를 반환합니다. 수정 된 스포츠 토토 결과 조치 및 원본 파 세트. 첫 번째 단계에서 원래 쿼리의 rangetable 스포츠 토토 결과 조치 파 세트에 통합됩니다. 이 결과 안에

shoelace_log에 삽입 
           *새*.sl_name,*new*.sl_avai,
           getpgusername (), dateTime ( 'now':: text)
      에서shoelace_data shoelace_data, shoelace_data *new *,
           shoelace_data *old *, shoelace_log shoelace_log;
2 단계에서 스포츠 토토 결과 자격이 추가됩니다. 결과 세트는 SL_AVAIL이 변경되는 행으로 제한됩니다.
shoelace_log에 삽입 
           *새*.sl_name,*new*.sl_avai,
           getpgusername (), dateTime ( 'now':: text)
      shoelace_data shoelace_data, shoelace_data *new *,
           shoelace_data *old *, shoelace_log shoelace_log여기서 int4ne (*new*.sl_avail,*old*.sl_avail);
3 단계에서 원래 ParsetRees 자격이 추가됩니다. 결과 집합을 추가로 만지면 원래 파 세트.
shoelace_log에 삽입 
           *새*.sl_name,*new*.sl_avai,
           getpgusername (), dateTime ( 'now':: text)
      shoelace_data shoelace_data, shoelace_data *new *,
           shoelace_data *old *, shoelace_log shoelace_log
     여기서 int4ne (*new*.sl_avail,*old*.sl_avail)및 bpchareq (shoelace_data.sl_name, 'sl7');
4 단계는 TargetList 항목으로 새로운 참조를 대체합니다 원래 파 세트 또는 일치 변수와 함께 결과 관계의 참조.
shoelace_log에 삽입shoelace_data.sl_name, 6,
           getpgusername (), dateTime ( 'now':: text)
      shoelace_data shoelace_data, shoelace_data *new *,
           shoelace_data *old *, shoelace_log shoelace_log
     여기서 int4ne (6, *Old *.sl_avail)
       및 bpchareq (shoelace_data.sl_name, 'sl7');
5 단계 이전 참조를 결과로 대체합니다 참조.
shoelace_log에 삽입 
           shoelace_data.sl_name, 6,
           getpgusername (), dateTime ( 'now':: text)
      shoelace_data shoelace_data, shoelace_data *new *,
           shoelace_data *old *, shoelace_log shoelace_log
     여기서 int4ne (6,shoelace_data.sl_avail)
       및 bpchareq (shoelace_data.sl_name, 'sl7');
그게 다야. 그래서 스포츠 토토 결과에서 수익을 최대로 줄였습니다. 시스템은 진술 :
shoelace_log에 삽입
           shoelace_data.sl_name, 6,
           getpgusername (), 'now'
      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';
사실 때문에 로그 항목이 작성되지 않습니다. 이번에는 원래 Parsetree에 TargetList가 포함되어 있지 않습니다. SL_AVAIL, NEW.SL_AVAIL에 대한 항목이 대체됩니다 shoelace_data.sl_avail 추가 쿼리가 발생합니다
shoelace_log에 삽입
           shoelace_data.sl_name,shoelace_data.sl_avail,
           getpgusername (), 'now'
      shoelace_data에서
     어디shoelace_data.sl_avail! = shoelace_data.sl_avail
       및 shoelace_data.sl_name = 'sl7';
그리고 그 자격은 결코 사실이 아닙니다. 아니요 인서트 사이의 파 세트 레벨의 차이 ... 선택 및 삽입 ... 값, 원래 쿼리가 수정하면 작동합니다. 여러 행. Al이 명령을 발행한다면
Shoelace_Data 업데이트 SL_AVAIL = 0
     여기서 sl_color = 'black';
실제로 4 개의 행이 업데이트됩니다 (SL1, SL2, SL3 및 SL4). 하지만 SL3은 이미 SL_AVAIL = 0입니다. 이번에는 원래 ParSetRees 자격이 다르고 추가 파 세트가 발생합니다
shoelace_log에 삽입
           shoelace_data.sl_name, 0,
           getpgusername (), 'now'
      shoelace_data에서
     여기서 0! = shoelace_data.sl_avail
       그리고shoelace_data.sl_color = 'black';
이 파 세트는 반드시 3 개의 새로운 로그 항목을 삽입합니다. 그리고 그것은 절대적으로 맞습니다.

원래의 파 세트가 마지막으로 실행되는 것이 중요합니다. 그만큼Postgres"Traffic Cop"는 a 두 가지 실행 사이의 명령 카운터 증분 두 번째는 첫 번째로 변경된 변경 사항을 볼 수 있도록 ParSetrees. 만약에 업데이트가 먼저 실행되었을 것입니다. 모든 행은 이미 0으로 설정되므로 로깅 인서트는 0 행을 찾지 못합니다. ! = shoelace_data.sl_avail.

협력 보기

언급 된 뷰 관계를 보호하는 간단한 방법 누군가가 보이지 않는 삽입, 업데이트 및 삭제할 수있는 가능성 그것들에 대한 데이터는 그 파수들을 버리도록하는 것입니다. 우리는 창조합니다 스포츠 토토 결과

신발 삽입물에 따라 스포츠 토토 결과을 작성하십시오
        대신 아무것도하지 않습니다.
    신발 업데이트와 같이 스포츠 토토 결과 신발 _upd_protect를 만듭니다
        대신 아무것도하지 않습니다.
    삭제에서 신발 삭제와 같이 스포츠 토토 결과 신발을 만듭니다
        대신 아무것도하지 말라;
만약 Al이 이제이 작업을 수행하려고한다면 관계신발, 스포츠 토토 결과 시스템이 적용됩니다 스포츠 토토 결과. 스포츠 토토 결과에는 조치가없고 대신 결과 ParsetRees 목록이 비어 있고 전체 쿼리가 최적화 할 남은 것이 없거나 스포츠 토토 결과 시스템이 완료된 후에 실행됩니다.

참고 :이 사실은 프론트 엔드 응용 프로그램을 자극 할 수 있습니다 데이터베이스에서 아무 일도 일어나지 않았으므로 백엔드는 쿼리에 대해 아무것도 반환하지 않습니다. 조차도 pgres_empty_query 또는 so는 libpq에서 사용할 수 있습니다. PSQL에서 아무 일도 일어나지 않습니다. 이것은 미래에 변할 수 있습니다.

스포츠 토토 결과 시스템을 사용하는보다 정교한 방법은 생성하는 것입니다. 파트 릿을 권리를 수행하는 스포츠 토토 결과으로 재 작성하는 스포츠 토토 결과 실제 테이블에서 작동. 에서 그렇게하려면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;
이제 Al 's Shop에 도착하는 신발 팩이 있습니다. 큰 부분이 있습니다. Al은 계산에 그다지 좋지 않습니다. 그가 수동으로 떼보기를 업데이트하기를 원하지 않습니다. 대신 우리 두 개의 작은 테이블을 설정하는데, 하나는 항목을 삽입 할 수 있습니다. PATLIST와 특별한 트릭이있는 하나. 에 대한 명령을 작성합니다 무엇이든 :
테이블 생성 shoelace_arrive (
        arr_name char (10),
        arr_quant 정수
    );

    테이블 생성 shoelace_ok (
        ok_name char (10),
        OK_QUANT 정수
    );

    shoelace_ok에 삽입 된 insert와 같이 규칙 shoelace_ok_ins를 만듭니다
        대신하십시오
        Shoelace 세트를 업데이트하십시오
               sl_avail = sl_avail + new.ok_quant
         여기서 sl_name = new.ok_name;
이제 Al은 앉아서 무엇이든 할 수 있습니다
al_bundy = select * from shoelace_arrive;
    arr_name | arr_quant
    ----------+-------
    SL3 |       10
    SL6 |       20
    SL8 |       20
    (3 줄)
정확히 부품 목록에있는 것입니다. 우리는 간단히 살펴 봅니다 현재 데이터에서
al_bundy = 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
    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 줄)
도착한 신발 끈을 움직여
al_bundy = shoelace_ok에 삽입 *에서 shoelace_arrive;
결과 확인
al_bundy = 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 줄)

    al_bundy = select * from 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 Set 업데이트
           sl_avail = int4pl (shoelace.sl_avail, shoelace_arrive.arr_quant)
      shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok,
           shoelace_ok *old *, shoelace_ok *new *,
           신발 끈
     여기서 bpchareq (shoelace.sl_name, showlace_arrive.arr_name);
원래 삽입물을 버립니다Shoelace_ok. 이 다시 작성된 쿼리가 전달됩니다 다시 스포츠 토토 결과 시스템과 두 번째 적용 스포츠 토토 결과 'shoelace_upd' 생산
Shoelace_Data 세트 업데이트
           sl_name = shoelace.sl_name,
           sl_avail = int4pl (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 *,
           신발 끈, 떼 *old *,
           Shoelace *new *, shoelace_data showlace_data
     여기서 bpchareq (shoelace.sl_name, showlace_arrive.arr_name)
       및 bpchareq (shoelace_data.sl_name, shoelace.sl_name);
다시 한번 그것은 대체 규칙이고 이전의 Parsetree는 쓰레기. 이 query sill은보기를 사용합니다Shoelace그러나 스포츠 토토 결과 시스템은 완료되지 않았습니다 이 루프는 계속해서 스포츠 토토 결과 '_retshoelace'를 적용합니다. 그리고 우리는 얻는다
Shoelace_Data 세트 업데이트
           sl_name = s.sl_name,
           sl_avail = int4pl (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 *,
           신발 끈, 떼 *old *,
           shoelace *new *, shoelace_data showlace_data,
           Shoelace *Old *, Shoelace *New *,
           shoelace_data s, 단위 u
     여기서 bpchareq (s.sl_name, showlace_arrive.arr_name)
       및 bpchareq (shoelace_data.sl_name, s.sl_name);
다시 업데이트 스포츠 토토 결과이 적용되었으므로 휠이 회전합니다. 켜짐 그리고 우리는 3 라운드를 다시 쓰고 있습니다.이 시간 스포츠 토토 결과 'log_shoelace' 추가 파트셋을 생성하는 것이 적용됩니다
shoelace_log에 삽입
           s.sl_name,
           int4pl (s.sl_avail, shoelace_arrive.arr_quant),
           getpgusername (),
           dateTime ( 'now':: text)
      shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok,
           shoelace_ok *old *, shoelace_ok *new *,
           신발 끈, 떼 *old *,
           shoelace *new *, shoelace_data showlace_data,
           Shoelace *Old *, Shoelace *New *,
           shoelace_data s, Unit U,
           shoelace_data *old *, shoelace_data *new *
           shoelace_log shoelace_log
     여기서 bpchareq (s.sl_name, showlace_arrive.arr_name)
       및 bpchareq (shoelace_data.sl_name, s.sl_name);
       및 int4ne (int4pl (s.sl_avail, shoelace_arrive.arr_quant),
                                                    s.sl_avail);
그 후 스포츠 토토 결과 시스템은 스포츠 토토 결과이 부족하여 ParsetRees를 생성했습니다. 그래서 우리는 두 개의 최종 Parsetrees로 끝납니다 와 같습니다.SQL진술
shoelace_log에 삽입
           s.sl_name,
           s.sl_avail + shoelace_arrive.arr_quant,
           getpgusername (),
           '지금'
      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;
결과는 하나의 관계에서 나오는 데이터가 삽입되었습니다. 다른 사람으로, 세 번째 업데이트로 변경되어 네 번째 플러스 최종 업데이트를 5 분의 1 로그인하면 업데이트됩니다. 두 쿼리로 줄어 듭니다.

약간 추악한 세부 사항이 있습니다. 둘을보고 있습니다 쿼리가 밝혀졌습니다.Shoelace_data관계는 확실히 할 수있는 rangetable에서 두 번 나타납니다. 하나로 줄입니다. Optimizer는 그것을 처리하지 않습니다 인서트의 스포츠 토토 결과 시스템 출력에 대한 실행 계획 BE

중첩 루프
  - 합병 조인
        - SEQ 스캔
              - 정렬
                    - seq scan on s
        - SEQ 스캔
              - 정렬
                    - shoelace_arrive에서 seq 스캔
  - SHOELACE_DATA에서 SEQ 스캔
여분의 rangetable 항목을 생략하면
합병 조인
  - SEQ 스캔
        - 정렬
              - seq scan on s
  - SEQ 스캔
        - 정렬
              - SHOELACE_ARRIVE에서 SEQ 스캔
로그 관계에서 동일한 항목을 완전히 생성합니다. 따라서 스포츠 토토 결과 시스템은에 대해 하나의 추가 스캔을 일으켰습니다.Shoelace_data절대적이지 않은 관계 필요한. 그리고 동일한 쓸모없는 스캔이 업데이트. 그러나 모든 것을 가능하게하는 것은 정말 어려운 일이었습니다. 모두.

최종 시연Postgres규칙 시스템과 전력입니다. 거기 있습니다 신발을 판매하는 귀여운 금발. 그리고 Al은 결코 할 수 없었습니다 그녀는 귀엽고, 그녀도 똑똑하다 - 조금 너무 똑똑하다. 따라서 Al은 때때로 절대 판매 할 수 없습니다. 이번에 그는 1000 쌍의 주문을 주문했다 Magenta Shoelaces와 다른 종류는 현재 사용할 수 없기 때문에 그러나 그는 일부를 사겠다고 약속했고, 또한 그의 데이터베이스를 준비했습니다. 분홍색.

al_bundy = Shoelace 값에 삽입하십시오 
    al_bundy- ( 'sl9', 0, '핑크', 35.0, '인치', 0.0);
    al_bundy = 신발 값에 삽입하십시오 
    al_bundy- ( 'sl10', 1000, 'magenta', 40.0, 'inch', 0.0);
이런 일이 자주 발생하므로 Shoelace를 찾아야합니다 가끔 신발이 없다는 항목. 우리는 할 수 있습니다 매번 복잡한 진술에서, 또는 우리는보기를 설정할 수 있습니다. 그것을 위해. 이것에 대한 견해는
보기 생성 shoelace_obsolete as
        존재하지 않는 곳에 * Shoelace에서 *를 선택하십시오
            (slcolor = sl_color 인 Shoe에서 Shoename을 선택하십시오);
출력입니다
al_bundy = select * from shoelace_obsolete;
    sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm
    ----------+--------+----------+-------+--------------
    SL9 |       0 | 핑크 |    35 | 인치 |     88.9
    SL10 |    1000 | Magenta |    40 | 인치 |    101.6
1000 마르젠타 신발 끈의 경우 우리는 할 수 있기 전에 부채를 빚어 야합니다. 버리십시오. 그러나 그것은 또 다른 문제입니다. 분홍색 항목 우리 삭제. 조금 더 어렵게 만들기 위해Postgres, 직접 삭제하지 않습니다. 대신에 우리는 하나 더보기를 만듭니다
보기 Shoelace_candelete 님으로보기를 작성하십시오
        shoelace_obsolete에서 * 선택 * sl_avail = 0;
그리고 이렇게하십시오 :
존재하는 Shoelace에서 삭제
        (SHOELACE_CANDELETE에서 *를 선택하십시오
                 여기서 sl_name = shoelace.sl_name);
Voila :
al_bundy = 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 | Magenta |    40 | 인치 |    101.6
    SL5 |       4 | 브라운 |     1 | m |      100
    SL6 |      20 | 브라운 |   0.9 | m |       90
    (9 줄)
a 뷰에서 삭제, 하위 선택 자격과 함께 Total은 4 개의 중첩/조인 뷰를 사용하며, 그 중 하나 자체는 다음과 같습니다. 뷰가 포함 된 자격과 계산 된보기를 하위 선택합니다 열이 사용되며 하나의 단일 파 세트로 다시 작성됩니다. 실제 테이블에서 요청 된 데이터를 삭제합니다.

실제 세계에는 몇 가지 상황이 있다고 생각합니다. 그러한 구성이 필요한 경우. 그러나 그것은 나를 느끼게한다 편안하게 작동합니다.

진실은 다음과 같습니다.이 작업을 수행하는 동안 버그가 하나 더 발견되었습니다 이 문서 작성. 그러나 고치고 난 후에 나는 조금이었다 전혀 작동한다는 사실에 놀랐습니다.