이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 39.4. 삽입, 업데이트 및 삭제 토토 핫버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

34.3. 스포츠 토토 베트맨삽입, 업데이트삭제

정의 된 스포츠 토토 베트맨삽입, 업데이트삭제는보기와 크게 다릅니다 이전 섹션에 설명 된 규칙. 첫째, 그들의스포츠 토토 베트맨 만들기명령은 더 많은 것을 허용합니다 :

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

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

  • 될 수 있습니다대신또는또한(기본값).

  • 가사선NEWold유용해진다.

  • 스포츠 토토 베트맨 자격을 가질 수 있습니다.

둘째, 쿼리 트리를 제자리에 수정하지 않습니다. 대신에 그들은 0 이상의 새로운 쿼리 트리를 만들고 원래.

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

구문 유지

만들기 [또는 교체] 스포츠 토토 베트맨 만들기이름as이벤트to테이블[여기서조건]
    [또한 | 대신] 아무것도 |명령| (명령;명령...)

염두에 두십시오. 다음에서업데이트 규칙정의 된 스포츠 토토 베트맨을 의미합니다삽입, 업데이트또는삭제.

업데이트 규칙은 결과가 발생할 때 규칙 시스템에 적용됩니다. 쿼리 트리의 관계 및 명령 유형은 에 주어진 개체 및 이벤트생성 스포츠 토토 베트맨명령. 업데이트 규칙의 경우 규칙 시스템이 생성합니다 쿼리 트리 목록. 처음에는 쿼리 트리 목록이 비어 있습니다. 0이있을 수 있습니다 (아무것도키 단어), 하나 또는 여러 행동. 단순화하기 위해 규칙을 살펴 보겠습니다 하나의 행동으로. 이 규칙은 자격을 가질 수 있습니다 될 수 있습니다대신또는또한(기본값).

스포츠 토토 베트맨 자격이란 무엇입니까? 그것은 제한이라는 제한입니다 스포츠 토토 베트맨의 행동이 수행되어야하는 경우와 그렇지 않은 경우. 이것 자격은 유사성 만 참조 할 수 있습니다NEW및/또는old기본적으로 객체로 주어진 관계를 나타냅니다 (그러나 특별한 의미로).

따라서 다음 쿼리 트리를 생성하는 4 가지 사례가 있습니다. 일회용 규칙을 위해.

자격 없음 및또한

원본과 함께 스포츠 토토 베트맨 조치의 쿼리 트리 쿼리 트리의 자격 추가

자격은 없지만대신

원본과 함께 스포츠 토토 베트맨 조치의 쿼리 트리 쿼리 트리의 자격 추가

자격 제공 및또한

스포츠 토토 베트맨과 스포츠 토토 베트맨 조치의 쿼리 트리 자격 및 원래 쿼리 트리의 자격 추가

자격 제공 및대신

스포츠 토토 베트맨과 스포츠 토토 베트맨 조치의 쿼리 트리 자격과 원래 쿼리 트리 자격; 그리고 원래의 쿼리 트리 부정적인 스포츠 토토 베트맨 자격 추가

마지막으로 스포츠 토토 베트맨이있는 경우또한, 변경되지 않은 원래 쿼리 트리가 목록에 추가됩니다. 만 자격 있는대신규칙은 이미 추가되었습니다 원래 쿼리 트리, 우리는 하나 또는 두 가지로 끝납니다. 한 번의 행동이있는 규칙에 대한 출력 쿼리 트리.

forinsert스포츠 토토 베트맨, 원본 쿼리 (억제되지 않으면대신) 규칙에 의해 추가 된 조치 전에 수행됩니다. 이것은 허용합니다 삽입 된 행을보기위한 조치. 하지만on updateandON DELETE규칙, 원래 쿼리는 추가 작업 후에 수행됩니다. 규칙. 이렇게하면 동작이 업데이트 된 것을 볼 수 있습니다 또는 삭제 될 행; 그렇지 않으면 행동이 아무것도하지 않을 수 있습니다 그들은 자격과 일치하는 줄을 찾지 못하기 때문에.

규칙 행동에서 생성 된 쿼리 트리는 시스템을 다시 작성하면 더 많은 규칙이 적용됩니다. 쿼리 나무가 다소 쿼리됩니다. 따라서 규칙의 행동은해야합니다 명령 유형이 다른 또는 다른 결과가 있습니다. 규칙 자체가 켜져있는 것보다 관계가 있습니다. 그렇지 않으면이 재귀는 프로세스는 무한 루프로 끝납니다. (재귀 확장 규칙의 규칙이 감지되어 오류로보고됩니다.)

쿼리 나무의 행동에서 발견 된 쿼리 트리pg_rewrite시스템 카탈로그는 단지 템플릿입니다. 그들은 범위 테이블 항목을 참조 할 수 있기 때문에NEWold, 일부 사용하기 전에 대체해야합니다. 어떤 것도 에 대한 참조NEW, 대상 목록 원래 쿼리는 해당 항목을 검색합니다. 만약에 발견 된 입장의 표현은 참조를 대체합니다. 그렇지 않으면,NEWold(업데이트) 또는 널 값으로 대체됩니다 (삽입). 에 대한 참조old에 대한 참조로 대체됩니다 결과 관계 인 범위 테이블 항목.

시스템이 업데이트 규칙을 적용한 후에는 적용됩니다. 생성 된 쿼리 트리에 대한 규칙을 봅니다. 보기는 삽입 할 수 없습니다 새로운 업데이트 작업이므로 업데이트 규칙을 View Rewriting의 출력.

34.3.1.1. 단계별로 첫 번째 스포츠 토토 베트맨

우리가의 변화를 추적하고 싶다고 말합니다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

및 The Action

shoelace_log 값에 삽입
       *새*.sl_name,*new*.sl_avail,
       current_user, current_timestamp)
  shoelace_data *new *, shoelace_data *old *;

(이것은 정상적으로 할 수 없기 때문에 조금 이상하게 보입니다 쓰다삽입 ... 값 ... From. 그만큼From여기서 절 항의 조항입니다 쿼리 트리에 레인지 테이블 항목이 있음을 나타냅니다. 을 위한*New*and*old*. 이것들은 그들이 될 수 있도록 필요합니다 의 변수에 의해 참조삽입명령의 쿼리 트리.)

스포츠 토토 베트맨은 자격을 갖추고 있습니다또한규칙, 따라서 규칙 시스템은 두 개의 쿼리 트리를 반환해야합니다. 수정 된 규칙 조치 및 원래 쿼리 트리. 1 단계에서 원래 쿼리의 범위 테이블은 규칙의 조치 쿼리 트리. 이것은 다음과 같은 결과를 초래합니다.

shoelace_log 값에 삽입
       *새*.sl_name,*new*.sl_avail,
       current_user, current_timestamp)
  Shoelace_data에서 *New *, Shoelace_data *Old *,shoelace_data shoelace_data;

2 단계에서는 스포츠 토토 베트맨 자격이 추가됩니다. 결과 세트는 줄로 제한됩니다SL_AVAIL변경 :

shoelace_log 값에 삽입 (
       *새*.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;

삽입 ... 값없음여기서조항이지만 플래너 및 집행자는 어려움이 없을 것입니다. 그들은 필요합니다 어쨌든이 동일한 기능을 지원하십시오.삽입 ... 선택.)

3 단계에서 원래 쿼리 트리의 자격은 다음과 같습니다 추가, 결과 세트를 행으로 만 추가로 제한합니다. 원래 쿼리에 의해 접촉했을 것입니다.

shoelace_log 값에 삽입 (
       *새*.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_availand 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_availshoelace_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 업데이트 SL_AVAIL = 0
 여기서 sl_color = 'black';

실제로 4 개의 행이 업데이트됩니다 (SL1, SL2, SL3SL4). 하지만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.

34.3.2. 협력 보기

언급 된 뷰 관계를 보호하는 간단한 방법 누군가가 달리려고 할 가능성삽입, 업데이트또는삭제그들에게는 그 쿼리를하도록하는 것입니다 나무가 버려집니다. 그래서 우리는 스포츠 토토 베트맨을 만듭니다

신발 삽입물에 따라 규칙을 작성하십시오
    대신 아무것도하지 않습니다.
신발 업데이트와 같이 규칙 신발 _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_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 *,
       신발 끈, 떼 *old *,
       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 *,
       신발 끈, 떼 *old *,
       shoelace *new *, shoelace_data shoelace_data,
       Shoelace *Old *, Shoelace *New *,
       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 *,
       신발 끈, 떼 *old *,
       shoelace *new *, shoelace_data shoelace_data,
       Shoelace *Old *, Shoelace *New *,
       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;

결과는 하나의 관계에서 나오는 데이터가 삽입되었습니다. 다른 사람으로, 세 번째 업데이트로 변경되어 네 번째 플러스 최종 업데이트 로그 업데이트 5 분의 1 두 쿼리로 줄어 듭니다.

약간 추악한 세부 사항이 있습니다. 보고 두 쿼리,Shoelace_data관계는 두 번 나타납니다 확실히 하나로 줄일 수있는 범위 테이블. 그만큼 플래너는 그것을 처리하지 않으므로 규칙 시스템 출력삽입의지 BE

중첩 루프
  - 합병 조인
        - 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, 'pink', 35.0, 'inch', 0.0);
신발 값 값 ( 'SL10', 1000, 'Magenta', 40.0, 'inch', 0.0)에 삽입

우리는 어느 것을 확인하고 싶습니다Shoelace항목은 신발에 맞지 않습니다. 이것에 대한 견해는

보기 Shoelace_mistatch를 만듭니다
    존재하지 않는 곳에 * 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

이제 우리는 그것을 일치하지 않도록 설정하고 싶습니다. 재고가 없습니다. 데이터베이스에서 삭제됩니다. 그것을 만들기 위해 조금 더 힘들어PostgreSQL, 직접 삭제하지 않습니다. 대신 우리는 하나를 더 만듭니다 보다

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 개의 중첩/가입 뷰를 사용하는 자격 그들 중 하나 자체는 보기 및 계산 된보기 열이 사용되는 경우 다시 작성됩니다. 요청 된 데이터를 삭제하는 하나의 단일 쿼리 트리로 진짜 테이블.

실제에는 몇 가지 상황이있을 것입니다. 그러한 구성이 필요한 세상. 그러나 그것은 당신을 만듭니다 그것이 효과가 있다는 느낌.