PostgreSQL: kèo bóng đá hôm | |||
---|---|---|---|
prev | UP | Chương 5. Định nghĩa dữ liệu | NEXT |
PostgreSQLthực hiện kế kèo bóng đá hom nay bảng, có thể là một công cụ hữu ích cho các nhà thiết kế cơ sở dữ liệu. .
Hãy bắt đầu với một ví dụ: Giả sử chúng ta đang cố gắng xây dựng một mô hình dữ liệu cho các thành phố. Mỗi tiểu bang có nhiều thành phố, nhưng chỉ có một vốn. Chúng tôi muốn có thể nhanh chóng lấy lại thành phố thủ đô cho bất kỳ tiểu bang cụ thể nào. Điều này có thể được thực hiện bằng cách tạo hai bảng, một cho thủ đô nhà nước và một cho các thành phố không phải là thủ đô. Tuy nhiên, điều gì xảy ra khi chúng tôi muốn hỏi dữ liệu về một thành phố, bất kể đó có phải là vốn hay không? Tính năng kế kèo bóng đá hom nay có thể giúp giải quyết vấn đề này. Chúng tôi xác địnhThủ đôBảng để nó kế kèo bóng đá hom nay từThành phố:
Tạo các thành phố bảng ( tên văn bản, Dân số nổi, độ cao int - tính bằng chân ); Tạo bảng xếp hạng ( Nhà nước Char (2) ) Kế kèo bóng đá hom nay (thành phố);
Trong trường hợp này,Thủ đôkèo bóng đá hom naykế kèo bóng đá hom nayTất cả kèo bóng đá hom nay cột của bảng cha mẹ của nó,Thành phố. Thủ đô trạng thái cũng có một cột phụ,Bang, hiển thị trạng thái của họ.
inPostgreSQL, Bảng có thể kế kèo bóng đá hom nay từ số 0 hoặc nhiều bảng khác và truy vấn có thể tham chiếu tất cả các hàng của bảng hoặc tất cả các hàng của bảng cộng với tất cả các bảng hậu duệ của nó. Hành vi sau là mặc định. Ví dụ, truy vấn sau đây tìm thấy tên của tất cả các thành phố, bao gồm cả thủ đô nhà nước, nằm ở độ cao trên 500 feet:
Chọn tên, độ cao Từ kèo bóng đá hom nay thành phố Nơi độ cao 500;
Cho dữ liệu mẫu từPostgreSQLHướng dẫn (xemPhần 2.1), Điều này trả về:
Tên | độ cao -----------+----------- Las Vegas | 2174 Mariposa | 1953 Madison | 845
Mặt khác, kèo bóng đá hom nay truy vấn sau đây tìm thấy tất cả kèo bóng đá hom nay thành phố không phải là thủ đô nhà nước và nằm ở độ cao trên 500 feet:
Chọn tên, độ cao Chỉ từ kèo bóng đá hom nay thành phố Trong đó độ cao 500; Tên | độ cao -----------+----------- Las Vegas | 2174 Mariposa | 1953
ở đâyChỉTừ khóa chỉ ra rằng truy vấn chỉ nên áp dụng choThành phố, và không phải bất kỳ kèo bóng đá hom nay nào bên dướiThành phốTrong hệ thống phân cấp kế kèo bóng đá hom nay. Nhiều lệnh mà chúng ta đã thảo luận -Chọn, Cập nhậtvàXóa- Hỗ trợchỉTừ khóa.
Bạn cũng có thể viết tên kèo bóng đá hom nay bằng dấu vết*Để chỉ định rõ ràng rằng kèo bóng đá hom nay bảng hậu duệ được bao gồm:
Chọn tên, độ cao Từ kèo bóng đá hom nay thành phố* Nơi độ cao 500;
Viết*Không cần thiết, vì hành vi này là mặc định (trừ khi bạn đã thay đổi cài đặt củaSQL_InheritanceTùy chọn cấu hình). Tuy nhiên viết*Có thể hữu ích để nhấn mạnh rằng kèo bóng đá hom nay bảng bổ sung sẽ được tìm kiếm.
Trong một số trường hợp, bạn có thể muốn biết kèo bóng đá hom nay nào một hàng cụ thể bắt nguồn từ. Có một cột hệ thống được gọi làTableoidTrong mỗi kèo bóng đá hom nay có thể cho bạn biết kèo bóng đá hom nay gốc:
Chọn C.Tableoid, C.Name, C.elevation Từ kèo bóng đá hom nay thành phố c Trong đó C.elevation 500;
Trở lại:
Tableoid | Tên | độ cao ----------+-----------+----------- 139793 | Las Vegas | 2174 139793 | Mariposa | 1953 139798 | Madison | 845
(Nếu bạn cố gắng sao chép ví dụ này, có lẽ bạn sẽ nhận được kèo bóng đá hom nay OID số khác nhau.) Bằng cách thực hiện tham gia vớiPG_ClassBạn có thể thấy tên kèo bóng đá hom nay thực tế:
Chọn p.relname, c.name, c.elevation Từ kèo bóng đá hom nay thành phố C, pg_class p Trong đó C.elevation 500 và c.tableoid = p.oid;
Trở lại:
Relname | Tên | độ cao ----------+-----------+----------- Thành phố | Las Vegas | 2174 Thành phố | Mariposa | 1953 Thủ đô | Madison | 845
Một cách khác để có được hiệu ứng tương tự là sử dụngRegClassPseudo-type, sẽ in kèo bóng đá hom nay oid một cách tượng trưng:
Chọn C.Tableoid :: RegClass, C.Name, C.elevation Từ kèo bóng đá hom nay thành phố c Trong đó C.elevation 500;
Kế kèo bóng đá hom nay không tự động truyền dữ liệu từChènhoặcCopyCác lệnh cho các bảng khác trong phân cấp kế kèo bóng đá hom nay. Trong ví dụ của chúng tôi, sau đâyChènCâu lệnh sẽ thất bại:
Chèn vào kèo bóng đá hom nay thành phố (tên, dân số, độ cao, trạng thái) kèo bóng đá hom nay giá trị ('Albany', null, null, 'ny');
Chúng tôi có thể hy vọng rằng dữ liệu bằng cách nào đó sẽ được chuyển đếnThủ đôkèo bóng đá hom nay, nhưng điều này không xảy ra:ChènLuôn chèn vào chính xác kèo bóng đá hom nay được chỉ định. Trong một số trường hợp, có thể chuyển hướng chèn bằng quy tắc (xemChương 39). Tuy nhiên, điều đó không giúp ích gì cho trường hợp trên vìThành phốkèo bóng đá hom nay không chứa cộtBang, và do đó, lệnh sẽ bị từ chối trước khi có thể áp dụng quy tắc.
15939_16094Không kế kèo bóng đá hom naymệnh đề. Các loại ràng buộc khác (duy nhất, khóa chính và các ràng buộc khóa nước ngoài) không được kế kèo bóng đá hom nay.
Một bảng có thể kế kèo bóng đá hom nay từ nhiều bảng cha mẹ, trong trường hợp nó có sự kết hợp của các cột được xác định bởi các bảng cha. Bất kỳ cột nào được khai báo trong định nghĩa của bảng con đều được thêm vào những cột này. Nếu cùng một tên cột xuất hiện trong nhiều bảng cha mẹ hoặc trong cả bảng cha và định nghĩa của con, thì các cột này là"Hợp nhất"để chỉ có một cột như vậy trong bảng con. Để được hợp nhất, kèo bóng đá hom nay cột phải có cùng loại dữ liệu, nếu không một lỗi được nêu ra. kèo bóng đá hom nay ràng buộc kiểm tra di truyền và kèo bóng đá hom nay ràng buộc không có null được hợp nhất theo cách tương tự. Do đó, ví dụ, một cột được hợp nhất sẽ được đánh dấu không có null nếu bất kỳ một trong kèo bóng đá hom nay định nghĩa cột mà nó đến từ được đánh dấu không null. Kiểm tra kèo bóng đá hom nay ràng buộc được hợp nhất nếu chúng có cùng tên và sự hợp nhất sẽ thất bại nếu điều kiện của chúng khác nhau.
Kế kèo bóng đá hom nay bảng thường được thiết lập khi bảng con được tạo, sử dụngkế kèo bóng đá hom naymệnh đề củaPostgreSQL: Tài liệu: 9Tuyên bố. Ngoài ra, một kèo bóng đá hom nay đã được xác định theo cách tương thích có thể có mối quan hệ cha mẹ mới, sử dụngkế kèo bóng đá hom nayBiến thể củakèo bóng đá hom nay thay đổi. Để làm điều này, bảng con mới phải bao gồm các cột có cùng tên và loại với các cột của cha mẹ. Nó cũng phải bao gồm các ràng buộc kiểm tra với cùng tên và kiểm tra các biểu thức như của cha mẹ. Tương tự, một liên kết kế kèo bóng đá hom nay có thể được xóa khỏi một đứa trẻ bằng cách sử dụngKhông kế kèo bóng đá hom nayBiến thể củaBẢNG ALTER. Việc thêm và loại bỏ các liên kết kế kèo bóng đá hom nay như thế này có thể hữu ích khi mối quan hệ kế kèo bóng đá hom nay đang được sử dụng để phân vùng bảng (xemPhần 5.10).
Một cách thuận tiện để tạo một kèo bóng đá hom nay tương thích mà sau này sẽ được tạo ra một đứa trẻ mới là sử dụngnhưmệnh đề trongTạo kèo bóng đá hom nay. Điều này tạo ra một bảng mới với cùng kèo bóng đá hom nay cột với bảng nguồn. Nếu cóKiểm trakèo bóng đá hom nay ràng buộc được xác định trên bảng nguồn,bao gồm kèo bóng đá hom nay ràng buộcTùy chọn đểnhưnên được chỉ định, vì đứa trẻ mới phải có kèo bóng đá hom nay ràng buộc phù hợp với cha mẹ để được coi là tương thích.
Bàn cha mẹ không thể bị loại bỏ trong khi bất kỳ con nào của nó vẫn còn. Không thể bỏ các cột hoặc kiểm tra các ràng buộc của các bảng con hoặc bị thay đổi nếu chúng được kế kèo bóng đá hom nay từ bất kỳ bảng cha mẹ nào. Nếu bạn muốn xóa một bảng và tất cả các hậu duệ của nó, một cách dễ dàng là thả bảng cha mẹ bằngCascadeTùy chọn (xemPhần 5.13).
kèo bóng đá hom nay thay đổisẽ tuyên truyền mọi thay đổi trong định nghĩa dữ liệu cột và kiểm tra các ràng buộc xuống hệ thống phân cấp kế kèo bóng đá hom nay. Một lần nữa, các cột rơi phụ thuộc vào các bảng khác chỉ có thể khi sử dụngCascadeTùy chọn.kèo bóng đá hom nay thay đổituân theo kèo bóng đá hom nay quy tắc tương tự để hợp nhất cột trùng lặp và từ chối áp dụng trongTạo kèo bóng đá hom nay.
Các truy vấn được kế kèo bóng đá hom nay chỉ thực hiện kiểm tra quyền truy cập trên bảng cha mẹ. Vì vậy, ví dụ, cấpCập nhậtquyền trênThành phốBảng ngụ ý quyền cập nhật kèo bóng đá hom nay hàng trongThủ đôkèo bóng đá hom nay cũng vậy, khi chúng được truy cập quaThành phố. Điều này bảo tồn sự xuất hiện mà dữ liệu là (cũng) trong kèo bóng đá hom nay cha. NhưngThủ đôkèo bóng đá hom nay không thể được cập nhật trực tiếp mà không có khoản trợ cấp bổ sung. Hai ngoại lệ cho quy tắc này làcắt ngắnvàkèo bóng đá hom nay khóa, trong đó kèo bóng đá hom nay quyền trên kèo bóng đá hom nay bảng con luôn được kiểm tra, cho dù chúng được xử lý trực tiếp hay đệ quy thông qua kèo bóng đá hom nay lệnh được thực hiện trên bảng cha.
Theo cách tương tự, kèo bóng đá hom nay chính sách bảo mật hàng của bảng cha mẹ (xemPhần 5.7) được áp dụng cho các hàng đến từ các bảng con trong một truy vấn được kế kèo bóng đá hom nay. Các chính sách của một bảng trẻ, nếu có, chỉ được áp dụng khi nó được đặt tên rõ ràng trong truy vấn; và trong trường hợp đó, bất kỳ chính sách nào được gắn vào (các) cha mẹ của nó đều bị bỏ qua.
kèo bóng đá hom nay nước ngoài (xemPhần 5.11) cũng có thể là một phần của hệ thống phân cấp kế kèo bóng đá hom nay, như các bảng cha mẹ hoặc con, giống như các bảng thông thường có thể. Nếu một bàn nước ngoài là một phần của hệ thống phân cấp kế kèo bóng đá hom nay thì bất kỳ hoạt động nào không được hỗ trợ bởi Bàn nước ngoài cũng không được hỗ trợ trên toàn bộ hệ thống phân cấp.
Lưu ý rằng không phải tất cả các lệnh SQL đều có thể hoạt động theo phân cấp kế kèo bóng đá hom nay. Các lệnh được sử dụng để truy vấn dữ liệu, sửa đổi dữ liệu hoặc sửa đổi lược đồ (ví dụ:Chọn, Cập nhật, Xóa, Hầu hết kèo bóng đá hom nay biến thể củaBẢNG ALTER, nhưng khôngChènhoặckèo bóng đá hom nay thay đổi ... Đổi tên) Thông thường mặc định bao gồm kèo bóng đá hom nay bảng con và hỗ trợchỉKý hiệu để loại trừ chúng. kèo bóng đá hom nay lệnh thực hiện bảo trì và điều chỉnh cơ sở dữ liệu (ví dụ:Reindex, VACUUM) Thông thường chỉ hoạt động trên các bảng cá nhân, vật lý và không hỗ trợ đệ quy trên các hệ thống phân cấp kế kèo bóng đá hom nay. Hành vi tương ứng của mỗi lệnh riêng lẻ được ghi lại trong trang tham chiếu của nó (PostgreSQL: Tàikèo bóng đá hom nay lệnh SQL).
Một hạn chế nghiêm trọng của tính năng kế kèo bóng đá hom nay là các chỉ mục (bao gồm các ràng buộc duy nhất) và các ràng buộc khóa nước ngoài chỉ áp dụng cho các bảng đơn lẻ, không phải cho trẻ em kèo bóng đá hom nay kế của chúng. Điều này đúng trên cả hai mặt tham chiếu và tham chiếu của một ràng buộc quan trọng nước ngoài. Do đó, trong các điều khoản của ví dụ trên:
Nếu chúng ta khai báoThành phố.tênTo Beđộc đáohoặc AKhóa chính, Điều này sẽ không dừngThủ đôBảng từ việc có kèo bóng đá hom nay hàng có tên sao chép kèo bóng đá hom nay hàng trongThành phố. Và những hàng trùng lặp đó theo mặc định sẽ hiển thị trong kèo bóng đá hom nay truy vấn từThành phố. Trên thực tế, theo mặc địnhThủ đôhoàn toàn không có ràng buộc duy nhất nào, và do đó có thể chứa nhiều hàng có cùng tên. Bạn có thể thêm một ràng buộc duy nhất vàoThủ đô, nhưng điều này sẽ không ngăn chặn sự trùng lặp so vớiThành phố.
Tương tự, nếu chúng ta chỉ định rằngThành phố.tên Tài liệu tham khảoMột số kèo bóng đá hom nay khác, ràng buộc này sẽ không tự động tuyên truyền đếnThủ đô. Trong trường hợp này, bạn có thể làm việc xung quanh nó bằng cách thêm thủ côngTài liệu tham khảoràng buộc đối vớiThủ đô.
Chỉ định rằng cột của một kèo bóng đá hom nay khácTài liệu tham khảo Thành phố (Tên)sẽ cho phép kèo bóng đá hom nay khác chứa tên thành phố, nhưng không phải tên vốn. Không có cách giải quyết tốt cho trường hợp này.
23769_23948