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 tỷ lệ kèo bóng đá 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ế.

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

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

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

so với hai tỷ lệ kèo bóng đánh:

Tạo bảng MyView (cùng danh sách cột như mytab);
Tạo tỷ lệ kèo bóng đá "_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ế độ tỷ lệ kèo bóng đáLệnh làm nội bộ. Điều này có một số tác dụng phụ. Một trong số đó là thông tin về chế độ tỷ lệ kèo bóng đá trongPostgreSQL12686_12863

41.2.1. Làm saoChọntỷ lệ kèo bóng đá làm việc

tỷ lệ kèo bóng đáON 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 tỷ lệ kèo bóng đá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 tỷ lệ kèo bóng đá 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ọntỷ lệ kèo bóng đá được mô tả đầu tiên.

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

Các ví dụ cho chương này là hai chế độ tỷ lệ kèo bóng đá tham gia thực hiện một số tính toán và lần lượt một số lượt tỷ lệ kèo bóng đá sử dụng chúng. Một trong hai chế độ tỷ lệ kèo bóng đá đầ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 chúng ta cần trong hai mô tả hệ thống tỷ lệ kèo bóng đá đầu tiên là:

14797_15556

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ế độ tỷ lệ kèo bóng đá được tạo là:

15689_16627

TheTạo chế độ tỷ lệ kèo bóng đátỷ lệ kèo bóng đánh choShoelacetỷ lệ kèo bóng đá (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 tỷ lệ kèo bóng đá 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 truy vấn. tỷ lệ kèo bóng đá không có trình độ tỷ lệ kèo bóng đá (được thảo luận sau, với khôngChọntỷ lệ kèo bóng đá, kể từChọntỷ lệ kèo bóng đá hiện không có chúng) và đó làThay vào đó. Lưu ý rằng trình độ tỷ lệ kèo bóng đá không giống như trình độ truy vấn. Hành động của tỷ lệ kèo bóng đá của chúng tôi có trình độ truy vấn. Hành động của tỷ lệ kèo bóng đá là một cây truy vấn là bản sao củaChọncâu lệnh trong lệnh tạo tỷ lệ kèo bóng đá.

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ọntỷ lệ kèo bóng đá.

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

18100_19705

Đây là đơn giản nhấtChọn19773_19870Chọ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;

20187_20363Shoelace(người duy nhất cho đến bây giờ) nó tìm thấy_returntỷ lệ kèo bóng đá 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ế độ tỷ lệ kèo bóng đá, người viết lại chỉ cần tạo một mục bảng phạm vi phụ có chứa cây truy vấn hành động của quy tắc và thay thế mục nhập phạm vi này cho mục nhập ban đầu tham chiếu chế độ tỷ lệ kèo bóng đá. Cây truy vấn viết lại kết quả gần giống như khi bạn đã nhập:

21073_21474

Tuy nhiênShoelace cũShoelace mới. Các mục này không tham gia trực tiếp vào truy vấn, vì chúng không được tham chiếu bởi Cây tham gia hoặc danh sách mục tiêu của Sub Tricer. Người viết lại sử dụng chúng để lưu trữ thông tin kiểm tra đặc quyền truy cập ban đầu có mặt trong mục nhập bảng phạm vi tham chiếu chế độ tỷ lệ kèo bóng đá. Theo cách này, người thực thi vẫn sẽ kiểm tra tỷ lệ kèo bóng đá người dùng có đặc quyền thích hợp để truy cập chế độ tỷ lệ kèo bóng đá hay không, mặc dù không sử dụng trực tiếp chế độ tỷ lệ kèo bóng đá trong truy vấn viết lại.

Đó là quy tắc đầu tiên được áp dụng. Hệ thống quy tắc sẽ tiếp tục kiểm tra các mục bảng phạm vi còn lại trong truy vấn hàng đầu (trong ví dụ này không còn nữa), và nó sẽ kiểm tra đệ quy các mục bảng trong phạm vi trong trình điều khiển con được thêm vào để tỷ lệ kèo bóng đá bất kỳ chế độ tỷ lệ kèo bóng đá tham chiếu nào của chúng. (Nhưng nó sẽ không mở rộnghoặcmới- Nếu không, chúng tôi sẽ có đệ quy vô hạn!) Trong ví dụ này, không có tỷ lệ kèo bóng đá 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 cung cấp cho người lập kế hoạch.

22744_22964

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:

23391_23589

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

23763_24305

Tương tự, các tỷ lệ kèo bóng đá 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:

24551_25816

Đ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ủaHồikéo lênCác mục tiêu phụ, 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ó.

41.2.2. tỷ lệ kèo bóng đá các quy tắc trong khôngChọncâu tỷ lệ kèo bóng đánh

Hai chi tiết của cây truy vấn không được chạm vào trong mô tả các quy tắc tỷ lệ kèo bóng đá ở trên. Đây là loại lệnh và mối quan hệ kết quả. Trên thực tế, loại lệnh không cần thiết theo các quy tắc tỷ lệ kèo bóng đá, nhưng mối quan hệ kết quả có thể ảnh hưởng đến cách thức hoạt động của trình viết lại truy vấn, bởi vì cần phải thực hiện chăm sóc đặc biệt nếu quan hệ kết quả là một quan điểm.

Chỉ có một vài sự khác biệt giữa một cây truy vấn cho AChọnvà một cho bất kỳ tỷ lệ kèo bóng đánh nào khác. Rõ ràng, họ có một loại tỷ lệ kèo bóng đánh khác và cho một tỷ lệ kèo bóng đánh không phải làChọn, mối quan hệ kết quả chỉ ra mục nhập 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:

  • Các bảng phạm vi chứa các mục cho các bảngT1T2.

  • 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.

  • 28102_28154Acủa cả hai mục bảng phạm vi cho 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 hiện 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ọntỷ lệ kèo bóng đánh và khác làCậ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ậtvà 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 tỷ lệ kèo bóng đáế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).29959_30081CTIDCó thể được sử dụng để truy xuất hàng ban đầu củaT1Để được cập nhật. Sau khi thêmCTIDĐến danh sách đích, truy vấn thực sự trông giống như:

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ột30637_30645, Hàng kết quả mới được chèn vào bảng (sau khi tướcCTID) và trong tiêu đề hàng của hàng cũ, màCTIDchỉ vào,CMAXxmaxCác mục được đặt thành bộ đếm tỷ lệ kèo bóng đá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 tỷ lệ kèo bóng đá hoàn toàn theo cùng một cách cho bất kỳ lệnh nào. Không có sự khác biệt.

31390_31427PostgreSQL

Trên đây cho thấy cách hệ thống quy tắc kết hợp các định nghĩa tỷ lệ kèo bóng đá vào cây truy vấn ban đầu. Trong ví dụ thứ hai, một đơn giảnChọnTừ một chế độ tỷ lệ kèo bóng đá đã 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).

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

41.2.4. Cập nhật chế độ tỷ lệ kèo bóng đá

Điều gì xảy ra nếu chế độ tỷ lệ kèo bóng đá đượ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ế độ tỷ lệ kèo bóng đá.

33238_33412Chè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 tỷ lệ kèo bóng đáĐủ đơ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ế độ tỷ lệ kèo bóng đá có thể được cập nhật tự động, tỷ lệ kèo bóng đáTạo chế độ tỷ lệ kèo bóng đá.

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ế độ tỷ lệ kèo bóng đá. 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ế độ tỷ lệ kèo bóng đá, để 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 tỷ lệ kèo bóng đá để sản xuấthàng mà lệnh sẽ cố gắng cập nhật hoặc xóa. Vì vậy, chế độ tỷ lệ kèo bóng đá đượ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ế độ tỷ lệ kèo bóng đá 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ế độ tỷ lệ kèo bóng đá. 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ế độ tỷ lệ kèo bóng đá, bởi vì một chế độ tỷ lệ kèo bóng đá 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, một đặ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ế độ tỷ lệ kèo bóng đá. Người thực thi sử dụng giá trị này để cung cấpKhănhà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 tỷ lệ kèo bóng đá chỉ định các hành động thay thế choChèn, Cập nhậtXóalệnh trên chế độ tỷ lệ kèo bóng đá. 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ì tỷ lệ kèo bóng đá. Đó là chủ đề củaPhần 41.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ế độ tỷ lệ kèo bóng đá cóthay vìKích hoạt cũng như các tỷ lệ kèo bóng đá trênChèn, Cập nhậthoặcXóa, thì các tỷ lệ kèo bóng đá 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óa36736_36901

Nếu không cóThay vào đótỷ lệ kèo bóng đá hoặcthay vìKích hoạt cho chế độ tỷ lệ kèo bóng đá và người viết lại không thể tự động viết lại truy vấn dưới dạng bản cập nhật về mối quan hệ cơ sở cơ bản, một lỗi sẽ được ném vì người thực thi không thể cập nhật chế độ tỷ lệ kèo bóng đá như vậy.