Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn kèo bóng đá euro cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

40.2. Lượt kèo bóng đá euro và hệ thống quy tắc

chế độ kèo bóng đá euro trongPostgreSQLđược triển khai bằng hệ thống kèo bóng đá euro. Trên thực tế, về cơ bản không có sự khác biệt giữa:

Tạo kèo bóng đá euro myView là chọn * từ mytab;

so với hai lệnh:

Tạo bảng MyView (cùng danh sách cột như mytab);
Tạo kèo bóng đá euro "_return" như trên chọn vào myView do thay thế
    Chọn * từ mytab;

Bởi vì đây chính xác là những gìTạo chế độ kèo bóng đá euro12393_12505PostgreSQLDanh mục hệ thống giống hệt như đối với một bảng. Vì vậy, đối với trình phân tích cú pháp, hoàn toàn không có sự khác biệt giữa bảng và chế độ kèo bóng đá euro. Chúng giống nhau: quan hệ.

40.2.1. Làm saoChọnkèo bóng đá euro làm việc

kèo bóng đá eurotrên Chọnđược áp dụng cho tất cả các truy vấn làm bước cuối cùng, ngay cả khi lệnh được đưa ra làChèn, Cập nhậthoặcXóa. Và họ có các ngữ nghĩa khác nhau từ các kèo bóng đá euro trên các loại lệnh khác ở chỗ chúng sửa đổi cây truy vấn tại chỗ thay vì tạo một loại mới. Vì thếChọnkèo bóng đá euro được mô tả đầu tiên.

Hiện tại, chỉ có thể có một hành động trong mộtON CHỌNkèo bóng đá euro và nó phải là một điều kiện vô điều kiệnChọnHành động đóThay vào đó. Hạn chế này được yêu cầu để làm cho các kèo bóng đá euro đủ an toàn để mở chúng cho người dùng thông thường và nó hạn chếtrên ChọnQuy tắc hành động như chế độ kèo bóng đá euro.

Các ví dụ cho chương này là hai chế độ kèo bóng đá euro tham gia thực hiện một số tính toán và lần lượt một số lượt kèo bóng đá euro sử dụng chúng. Một trong hai chế độ kèo bóng đá euro đầu tiên được tùy chỉnh sau bằng cách thêm quy tắc choChèn, Cập nhậtXóaHoạt động để kết quả cuối cùng sẽ là một quan điểm hoạt động giống như một bảng thực sự với một số chức năng ma thuật. Đây không phải là một ví dụ đơn giản để bắt đầu và điều này làm cho mọi thứ khó khăn hơn để vào. Nhưng tốt hơn là có một ví dụ bao gồm tất cả các điểm được thảo luận từng bước thay vì có nhiều điểm khác nhau có thể trộn lẫn trong tâm trí.

Các bảng thực sự chúng ta cần trong hai mô tả hệ thống kèo bóng đá euro đầu tiên là:

Tạo bảng giày_data (
    Văn bản Shoename, - Khóa chính
    Số nguyên Sh_avail, - Số cặp có sẵn
    văn bản slcolor, - màu dây giày ưa thích
    slminlen real, - chiều dài dây giày tối thiểu
    slmaxlen real, - chiều dài dây giày tối đa
    văn bản slunit - đơn vị chiều dài
);

Tạo bảng Shoelace_Data (
    Text SL_NAME, - Khóa chính
    Số nguyên SL_AVAIL, - Số cặp có sẵn
    SL_COLOR Text, - Màu sắc Shoelace
    sl_len real, - chiều dài dây giày
    SL_UNIT Text - Đơn vị chiều dài
);

Tạo đơn vị bảng (
    un_name văn bản, - khóa chính
    un_fact real - yếu tố chuyển đổi thành cm
);

Như bạn có thể thấy, chúng đại diện cho dữ liệu cửa hàng giày.

Các chế độ kèo bóng đá euro được tạo là:

15468_16404

TheTạo chế độ kèo bóng đá eurolệnh choShoelacekèo bóng đá euro (cái đơn giản nhất chúng tôi có) sẽ tạo ra một mối quan hệShoelacevà một mục nhập trongPG_REWRITEĐiều đó cho biết rằng có một kèo bóng đá euro viết lại phải được áp dụng bất cứ khi nào quan hệShoelaceđược tham chiếu trong bảng phạm vi của một truy vấn. kèo bóng đá euro không có trình độ kèo bóng đá euro (được thảo luận sau, với khôngChọnkèo bóng đá euro, kể từChọnkèo bóng đá euro hiện không có chúng) và đó làThay vào đó. Lưu ý rằng trình độ kèo bóng đá euro không giống như trình độ truy vấn. Hành động của kèo bóng đá euro của chúng tôi có trình độ truy vấn. Hành động của kèo bóng đá euro là một cây truy vấn là bản sao củaChọnCâu lệnh trong lệnh tạo kèo bóng đá euro.

Lưu ý

Hai mục bảng phạm vi bổ sung chomớimà bạn có thể thấy trongPG_REWRITEmục nhập không quan tâm choChọnkèo bóng đá euro.

Bây giờ chúng tôi dân cưĐơn vị, giày_dataShoelace_datavà chạy một truy vấn đơn giản trên chế độ kèo bóng đá euro:

17845_19448

Đây là đơn giản nhấtChọn19512_19609Chọn * từ Shoelaceđã được trình phân tích cú pháp và sản xuất cây truy vấn:

Chọn Shoelace.SL_Name, Shoelace.SL_AVAIL,
       Shoelace.SL_Color, Shoelace.SL_LEN,
       Shoelace.SL_Unit, Shoelace.SL_LEN_CM
  Từ dây giày Shoelace;

Và điều này được trao cho hệ thống quy tắc. Hệ thống quy tắc đi qua bảng phạm vi và kiểm tra kèo bóng đá euro có quy tắc cho bất kỳ mối quan hệ nào không. Khi xử lý mục nhập bảng phạm vi choShoelace(người duy nhất cho đến bây giờ) nó tìm thấy_returnkèo bóng đá euro với cây truy vấn:

Chọn S.SL_NAME, S.SL_AVAIL,
       s.sl_color, s.sl_len, s.sl_unit,
       S.SL_LEN * U.UN_FACT AS SL_LEN_CM
  Từ Shoelace cũ, Shoelace Mới,
       shoelace_data s, đơn vị u
 Trong đó s.sl_unit = U.un_name;

Để mở rộng chế độ kèo bóng đá euro, người viết lại chỉ cần tạo một mục nhập bảng phạm vi con chứa cây truy vấn hành động của quy tắc và thay thế mục nhập bảng phạm vi này cho cái ban đầu tham chiếu chế độ kèo bóng đá euro. Cây truy vấn viết lại kết quả gần giống như khi bạn đã nhập:

Chọn Shoelace.SL_NAME, SHOELACE.SL_AVAIL,
       Shoelace.SL_Color, Shoelace.SL_LEN,
       Shoelace.SL_Unit, Shoelace.SL_LEN_CM
  Từ (chọn s.sl_name,
               s.sl_avail,
               s.sl_color,
               s.sl_len,
               s.sl_unit,
               S.SL_LEN * U.UN_FACT AS SL_LEN_CM
          Từ shoelace_data s, đơn vị u
         Trong đó s.sl_unit = U.un_name) Shoelace;

Tuy nhiênShoelace cũShoelace mới21364_21814

21820_22118hoặcmới- Nếu không, chúng ta sẽ có đệ quy vô hạn!) Trong ví dụ này, không có kèo bóng đá euro viết lại choShoelace_datahoặcĐơn vị, Vì vậy, việc viết lại đã hoàn tất và ở trên là kết quả cuối cùng được đưa ra cho người lập kế hoạch.

22445_22665

Chọn * từ giày_ready trong đó Total_avail = 2;

 Tên ShoenSy | sh_avail | SL_NAME | SL_AVAIL | Total_avail
----------+----------+----------+----------+-------------
 Sh1 |        2 | SL1 |        5 |           2
 Sh3 |        4 | SL7 |        7 |           4
(2 hàng)

Đầu ra của trình phân tích cú pháp lần này là cây truy vấn:

23078_23274

kèo bóng đá euro đầu tiên được áp dụng sẽ là cái choShoe_Readykèo bóng đá euro và nó dẫn đến cây truy vấn:

23440_23980

Tương tự, các kèo bóng đá euro chogiàyShoelaceđược thay thế vào bảng phạm vi của trình điều khiển con, dẫn đến một cây truy vấn cuối cùng ba cấp:

24218_25481

Điều này có thể trông kém hiệu quả, nhưng người lập kế hoạch sẽ thu gọn điều này thành một cây truy vấn cấp độ đơn củakéo lênHồiCác mục tiêu con, và sau đó nó sẽ lên kế hoạch cho các lần tham gia giống như chúng ta đã viết chúng ra theo cách thủ công. Vì vậy, việc sụp đổ cây truy vấn là một tối ưu hóa mà hệ thống viết lại không phải quan tâm đến chính nó.

40.2.2. kèo bóng đá euro các quy tắc trong khôngChọncâu

26064_26408

Chỉ có một vài sự khác biệt giữa một cây truy vấn cho AChọn26509_26620Chọn, mối quan hệ kết quả chỉ vào mục bảng phạm vi nơi kết quả sẽ đi. Mọi thứ khác hoàn toàn giống nhau. Vì vậy, có hai bảngT1T2với các cộtAB, Cây truy vấn cho hai câu:

Chọn T2.b từ T1, T2 trong đó t1.a = T2.a;

CẬP NHẬT T1 Đặt B = T2.B từ T2 trong đó T1.A = T2.A;

gần như giống hệt nhau. Đặc biệt:

  • 27269_27319T1T2.

  • Danh sách mục tiêu chứa một biến chỉ vào cộtBcủa mục nhập bảng phạm vi cho bảngT2.

  • Biểu thức đủ điều kiện so sánh các cộtAcủa cả hai mục bảng phạm vi cho sự bình đẳng.

  • Cây tham gia hiển thị sự kết nối đơn giản giữaT1T2.

Hậu quả là, cả hai cây truy vấn đều dẫn đến các kế hoạch thực thi tương tự: cả hai đều tham gia trên hai bảng. ChoCập nhậtCác cột bị thiếu từT1được thêm vào danh sách mục tiêu bởi người lập kế hoạch và cây truy vấn cuối cùng sẽ đọc là:

Cập nhật T1 Đặt A = T1.A, B = T2.B từ T2 trong đó T1.A = T2.A;

Và do đó, người thực thi chạy qua tham gia sẽ tạo ra chính xác cùng một kết quả được đặt như:

Chọn T1.A, T2.b từ T1, T2 trong đó T1.A = T2.A;

Nhưng có một chút vấn đề trongCập nhật: Phần của kế hoạch thực thi thực hiện tham gia không quan tâm đến kết quả từ sự tham gia là gì. Nó chỉ tạo ra một tập hợp kết quả của các hàng. Thực tế là một làChọn28764_28795Cập nhậtđược xử lý cao hơn trong người thực thi, trong đó nó biết rằng đây là mộtCập nhật, và nó biết rằng kết quả này sẽ đi vào bảngT1. Nhưng những hàng nào phải được thay thế bằng hàng mới?

Để giải kèo bóng đá euroết vấn đề này, một mục khác được thêm vào danh sách đích trongCập nhật(và cả trongXóa)CTID).Đây là cột hệ thống chứa số khối tệp và vị trí trong khối cho hàng. Biết bảng,CTIDcó thể được sử dụng để truy xuất hàng ban đầu củaT1Để được cập nhật. Sau khi thêmCTID29707_29760

Chọn T1.A, T2.B, T1.CTID từ T1, T2 trong đó T1.A = T2.A;

Bây giờ là một chi tiết khác củaPostgreSQLBước vào giai đoạn. Các hàng bảng cũ không được ghi đè và đây là lý do tại saorollbacklà nhanh. Trong mộtCập nhật, Hàng kết quả mới được chèn vào bảng (sau khi tướcCTID30189_30241CTIDchỉ vào,CMAXxmaxCác mục được đặt thành bộ đếm lệnh hiện tại và ID giao dịch hiện tại. Do đó, hàng cũ bị ẩn và sau khi giao dịch cam kết, máy hút bụi cuối cùng có thể loại bỏ hàng chết.

Biết tất cả những điều đó, chúng ta chỉ có thể áp dụng các quy tắc kèo bóng đá euro theo cách hoàn toàn giống với bất kỳ lệnh nào. Không có sự khác biệt.

40.2.3. Sức mạnh của các chế độ kèo bóng đá euro trongPostgreSQL

Trên đây cho thấy cách hệ thống quy tắc kết hợp các định nghĩa kèo bóng đá euro vào cây truy vấn ban đầu. Trong ví dụ thứ hai, một đơn giảnChọnTừ một chế độ kèo bóng đá euro đã tạo một cây truy vấn cuối cùng là tham gia 4 bảng (Đơn vịĐã được sử dụng hai lần với các tên khác nhau).

31212_31790PostgreSQLĐảm bảo rằng đây là tất cả thông tin có sẵn về truy vấn cho đến điểm đó.

40.2.4. Cập nhật chế độ kèo bóng đá euro

Điều gì xảy ra nếu chế độ kèo bóng đá euro được đặt tên là mối quan hệ đích cho mộtChèn, Cập nhậthoặcXóa? Thực hiện các thay thế được mô tả ở trên sẽ cung cấp một cây truy vấn trong đó các điểm quan hệ kết quả tại một mục bảng phạm vi phụ, sẽ không hoạt động. Có một số cách màPOSTGRESQLTuy nhiên, có thể hỗ trợ sự xuất hiện của việc cập nhật chế độ kèo bóng đá euro.

32549_32723Chèn, Cập nhậthoặcXóađược áp dụng cho mối quan hệ cơ sở theo cách thích hợp. Lượt kèo bóng đá euroĐủ đơn giảnĐối với điều này được gọi làTự động cập nhật. Để biết thông tin chi tiết về các loại chế độ kèo bóng đá euro có thể được cập nhật tự động, kèo bóng đá euroTạo chế độ kèo bóng đá euro.

Ngoài ra, thao tác có thể được xử lý bởi người dùng cung cấpthay vìTrigger trên chế độ kèo bóng đá euro. Viết lại hoạt động hơi khác nhau trong trường hợp này. VìChèn, người viết lại không làm gì cả với chế độ kèo bóng đá euro, để nó làm mối quan hệ kết quả cho truy vấn. VìCập nhậtXóa, vẫn cần phải mở rộng truy vấn kèo bóng đá euro để sản xuấtKhănhàng mà lệnh sẽ cố gắng cập nhật hoặc xóa. Vì vậy, chế độ kèo bóng đá euro được mở rộng như bình thường, nhưng một mục nhập bảng không bao giờ khác được thêm vào truy vấn để biểu diễn chế độ kèo bóng đá euro trong khả năng của nó là mối quan hệ kết quả.

Vấn đề hiện đang phát sinh là làm thế nào để xác định các hàng sẽ được cập nhật trong chế độ kèo bóng đá euro. Hãy nhớ lại rằng khi mối quan hệ kết quả là một bảng, một đặc biệtCTIDMục nhập được thêm vào danh sách mục tiêu để xác định các vị trí vật lý của các hàng sẽ được cập nhật. Điều này không hoạt động nếu mối quan hệ kết quả là một chế độ kèo bóng đá euro, bởi vì một chế độ kèo bóng đá euro không có bất kỳCTID, vì các hàng của nó không có vị trí vật lý thực tế. Thay vào đó, cho mộtCập nhậthoặcXóaHoạt động, đặc biệtWholerowMục nhập được thêm vào danh sách đích, mở rộng để bao gồm tất cả các cột từ chế độ kèo bóng đá euro. Người thực thi sử dụng giá trị này để cung cấpHànghàng đếnthay vìTrigger. Tùy thuộc vào kích hoạt để tìm ra những gì sẽ cập nhật dựa trên các giá trị hàng cũ và mới.

Khả năng khác là người dùng xác địnhThay vào đóCác kèo bóng đá euro chỉ định các hành động thay thế choChèn, Cập nhậtXóalệnh trên chế độ kèo bóng đá euro. Các quy tắc này sẽ viết lại lệnh, thường là một lệnh cập nhật một hoặc nhiều bảng, thay vì kèo bóng đá euro. Đó là chủ đề củaPhần 40.4.

Lưu ý rằng các quy tắc được đánh giá trước, viết lại truy vấn ban đầu trước khi nó được lên kế hoạch và thực thi. Do đó, nếu một chế độ kèo bóng đá euro cóthay vìKích hoạt cũng như các kèo bóng đá euro trênChèn, Cập nhậthoặcXóa, thì các kèo bóng đá euro sẽ được đánh giá trước và tùy thuộc vào kết quả, các kích hoạt có thể không được sử dụng.

Tự động viết lạiChèn, Cập nhậthoặcXóaTruy vấn trên chế độ kèo bóng đá euro đơn giản luôn được thử cuối cùng. Do đó, nếu một chế độ kèo bóng đá euro có quy tắc hoặc kích hoạt, chúng sẽ ghi đè hành vi mặc định của các chế độ kèo bóng đá euro có thể cập nhật tự động.

Nếu không cóThay vào đókèo bóng đá euro hoặcthay vì36299_36501