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

8.16. Các loại tổng kèo bóng đá euro

Aloại tổng kèo bóng đá eurođại diện cho cấu trúc của một hàng hoặc bản ghi; Nó thực chất chỉ là một danh sách các tên trường và kèo bóng đá euro dữ liệu của chúng.PostgreSQLCho phép các loại tổng kèo bóng đá euro được sử dụng theo nhiều cách giống nhau mà các loại đơn giản có thể được sử dụng. Ví dụ: một cột của bảng có thể được khai báo là loại tổng kèo bóng đá euro.

8.16.1. Khai báo các loại tổng kèo bóng đá euro

Đây là hai ví dụ đơn giản về việc xác định các loại tổng kèo bóng đá euro:

Tạo loại phức tạp như (
    r chính xác gấp đôi,
    Tôi gấp đôi độ chính xác
);

Tạo loại hàng tồn kho_item là (
    tên văn bản,
    Nhà cung cấp_id Số nguyên,
    Giá số
);

Cú pháp tương đương vớiTạo bảng, ngoại trừ chỉ có thể chỉ định tên và loại trường; Không có ràng buộc (chẳng hạn nhưkhông null) hiện có thể được bao gồm. Lưu ý rằngASTừ khóa là điều cần thiết; Không có nó, hệ thống sẽ nghĩ một loại khácTạo loạiLệnh có nghĩa là và bạn sẽ nhận được lỗi cú pháp lẻ.

Đã xác định kèo bóng đá euro, chúng ta có thể sử dụng chúng để tạo bảng:

12076_12222

hoặc kèo bóng đá euro chức năng:

12284_12448

Bất cứ khi nào bạn tạo bảng, loại tổng kèo bóng đá euro cũng tự động được tạo, với cùng tên với bảng, để biểu thị loại hàng của bảng. Ví dụ, chúng tôi đã nói:

Tạo bảng kiểm kê_item (
    tên văn bản,
    Nhà cung cấp nhà cung cấp_id kèo bóng đá euro nhà cung cấp tài liệu tham khảo,
    Kiểm tra số giá (Giá 0)
);

sau đó giống nhauInventory_Item12897_13172Không áp dụngvới các giá trị của loại tổng kèo bóng đá euro bên ngoài bảng. (Để làm việc xung quanh điều này, hãy tạo mộtDOMAINqua loại tổng kèo bóng đá euro và áp dụng các ràng buộc mong muốn làKiểm trakèo bóng đá euro ràng buộc của miền.)

8.16.2. Xây dựng các giá trị tổng kèo bóng đá euro

Để viết một giá trị tổng kèo bóng đá euro dưới dạng hằng số theo nghĩa đen, đặt các giá trị trường trong ngoặc đơn và tách chúng bằng dấu phẩy. Bạn có thể đặt dấu ngoặc kép xung quanh bất kỳ giá trị trường nào và phải làm như vậy nếu nó chứa dấu phẩy hoặc dấu ngoặc đơn. (Thông tin chi tiết xuất hiệnbên dưới.) Vì vậy, định dạng chung của hằng số tổng kèo bóng đá euro là như sau:

'(Val1 , Val2, ...) '

Một ví dụ là:

'("Xúc xắc mờ", 42,1,99)'

đó sẽ là giá trị kèo bóng đá euro lệ củaInventory_ItemLoại được xác định ở trên. Để làm cho một trường được null, hãy viết không có ký tự ở vị trí của nó trong danh sách. Ví dụ: hằng số này chỉ định trường thứ ba null:

'("Xúc xắc mờ", 42,)'

14870_14938

'("", 42,)'

Ở đây trường đầu tiên là chuỗi trống không null, thứ ba là null.

(Những hằng số này thực sự chỉ là một trường kèo bóng đá euro đặc biệt của các hằng số loại chung được thảo luận trongPhần 4.1.2.7. Hằng số ban đầu được coi là một chuỗi và được truyền đến thói quen chuyển đổi đầu vào loại tổng kèo bóng đá euro. Một đặc điểm kỹ thuật loại rõ ràng có thể cần thiết để cho biết loại nào để chuyển đổi hằng số thành.)

ThehàngCú pháp biểu thức cũng có thể được sử dụng để xây dựng các giá trị tổng kèo bóng đá euro. Trong hầu hết các trường kèo bóng đá euro, điều này đơn giản hơn đáng kể để sử dụng so với cú pháp theo yêu cầu chuỗi vì bạn không phải lo lắng về nhiều lớp trích dẫn. Chúng tôi đã sử dụng phương thức này ở trên:

hàng ('Dice mờ', 42, 1.99)
Hàng ('', 42, null)

Từ khóa hàng thực sự là tùy chọn miễn là bạn có nhiều trường trong biểu thức, vì vậy chúng có thể được đơn giản hóa thành:

('Xúc xắc mờ', 42, 1.99)
('', 42, null)

ThehàngCú pháp biểu thức được thảo luận chi tiết hơn trongPhần 4.2.13.

8.16.3. Truy cập các loại tổng kèo bóng đá euro

Để truy cập một trường của cột tổng kèo bóng đá euro, người ta viết một dấu chấm và tên trường, giống như chọn một trường từ tên bảng. Trên thực tế, nó rất giống với việc chọn từ một tên bảng mà bạn thường phải sử dụng dấu ngoặc đơn để không làm nhầm lẫn trình phân tích cú pháp. Ví dụ: bạn có thể cố gắng chọn một số trường con từ của chúng tôion_handBảng ví dụ với một cái gì đó như:

chọn item.name từ on_hand where item.price 9,99;

Điều này sẽ không hoạt động vì tênMụcđược coi là tên bảng, không phải tên cột củaon_hand, theo quy tắc cú pháp SQL. Bạn phải viết nó như thế này:

Chọn (mục) .Name từ on_hand WHERE (Mục) .Price 9,99;

17400_17495

Chọn (on_hand.item) .Name từ on_hand WHERE (on_hand.item).

Bây giờ đối tượng được giải thích chính xác là tham chiếu đếnMụcCột, và sau đó trường con có thể được chọn từ nó.

17799_18020

Chọn (my_func (...)). Trường từ ...

Không có dấu ngoặc đơn, điều này sẽ tạo ra lỗi cú pháp.

Tên trường đặc biệt*có nghĩa làHồiTất cả kèo bóng đá euro trườngHồi, như được giải thích thêm trongPhần 8.16.5.

8.16.4. Sửa đổi các loại tổng kèo bóng đá euro

Dưới đây là một số ví dụ về cú pháp thích kèo bóng đá euro để chèn và cập nhật các cột tổng kèo bóng đá euro. Đầu tiên, chèn hoặc cập nhật toàn bộ cột:

Chèn vào kèo bóng đá euro giá trị MyTab (Complex_col) ((1.1,2.2));

Cập nhật MyTab Set Complex_col = Row (1.1,2.2) trong đó ...;

Ví dụ đầu tiên bỏ quahàng, lần thứ hai sử dụng nó; chúng ta có thể đã làm điều đó theo bất kỳ cách nào.

Chúng ta có thể cập nhật một trường con riêng lẻ của cột tổng kèo bóng đá euro:

Cập nhật MyTab Set Complex_col.r = (Complex_col) .R + 1 trong đó ...;

Lưu ý ở đây rằng chúng ta không cần (và thực sự không thể) đặt dấu ngoặc đơn xung quanh tên cột xuất hiện ngay sauset, nhưng chúng ta cần dấu ngoặc đơn khi tham chiếu cùng một cột trong biểu thức ở bên phải của dấu bằng.

Và chúng ta có thể chỉ định kèo bóng đá euro trường con là mục tiêu choChèn, quá:

Chèn vào kèo bóng đá euro giá trị MyTab (Complex_col.r, Complex_col.i) (1.1, 2.2);

Nếu chúng tôi không cung cấp kèo bóng đá euro giá trị cho tất cả kèo bóng đá euro trường con của cột, kèo bóng đá euro trường con còn lại sẽ được lấp đầy bằng kèo bóng đá euro giá trị null.

8.16.5. Sử dụng các loại tổng kèo bóng đá euro trong truy vấn

Có nhiều quy tắc và hành vi cú pháp đặc biệt khác nhau liên quan đến các loại tổng kèo bóng đá euro trong các truy vấn. Các quy tắc này cung cấp các phím tắt hữu ích, nhưng có thể gây nhầm lẫn nếu bạn không biết logic đằng sau chúng.

inPostgreSQL, tham chiếu đến tên bảng (hoặc bí danh) trong truy vấn thực sự là một tham chiếu đến giá trị tổng kèo bóng đá euro của hàng hiện tại của bảng. Ví dụ: nếu chúng ta có một bảngInventory_Itemnhư được hiển thịở trên, chúng ta có thể viết:

Chọn C từ Incentory_Item C;

Truy vấn này tạo ra một cột có giá trị tổng kèo bóng đá euro duy nhất, vì vậy chúng tôi có thể nhận được đầu ra như:

c
------------------------
 ("Xúc xắc mờ", 42,1,99)
(1 hàng)

Tuy nhiên, lưu ý rằng kèo bóng đá euro tên đơn giản được khớp với tên cột trước tên bảng, vì vậy ví dụ này chỉ hoạt động vì không có cột có tênCTrong bảng của truy vấn.

21221_21265Table_Name.Cột_namecó thể được hiểu là áp dụngLựa chọn trườngvới giá trị tổng kèo bóng đá euro của hàng hiện tại của bảng. (Vì lý do hiệu quả, nó không thực sự được thực hiện theo cách đó.)

Khi chúng ta viết

Chọn c.* Từ incentory_item c;

Sau đó, theo tiêu chuẩn SQL, chúng ta nên lấy nội dung của bảng được mở rộng thành kèo bóng đá euro cột riêng biệt:

Tên | Nhà cung cấp_id | giá 
------------+-------------+-------
 Xúc xắc mờ |          42 |  1,99
(1 hàng)

như thể truy vấn là

22100_22164

PostgreSQLsẽ áp dụng hành vi mở rộng này cho bất kỳ biểu thức có giá trị tổng kèo bóng đá euro nào, mặc dù như được hiển thịở trên, bạn cần viết dấu ngoặc đơn xung quanh giá trị.*được áp dụng cho bất cứ khi nào nó không phải là một tên bảng đơn giản. Ví dụ: nếumyfunc ()là một hàm trả về loại tổng kèo bóng đá euro với các cộtA, BC, thì hai truy vấn này có cùng kết quả:

Chọn (myfunc (x)).* Từ một số_table;
Chọn (myfunc (x)). A, (myfunc (x)). B, (myfunc (x)).

TIP

PostgreSQLXử lý mở rộng cột bằng cách thực sự chuyển đổi biểu mẫu thứ nhất thành mẫu thứ hai. Vì vậy, trong ví dụ này,myfunc ()Sẽ được gọi ba lần mỗi hàng với một trong hai cú pháp. Nếu đó là một chức năng đắt tiền, bạn có thể muốn tránh điều đó, điều mà bạn có thể làm với một truy vấn như:

Chọn m.

23485_23513bên từMục giữ cho nó không được gọi nhiều hơn một lần mỗi hàng.m.*vẫn được mở rộng thànhM.A, M.B, M.C, nhưng bây giờ kèo bóng đá euro biến đó chỉ là kèo bóng đá euro tham chiếu đến đầu ra củatừMục. (ThebênTừ khóa là tùy chọn ở đây, nhưng chúng tôi hiển thị để làm rõ rằng chức năng đang nhận đượcxtừsomer_table.)

Thecomposite_value.*Cú pháp kết quả trong việc mở rộng cột của loại này khi nó xuất hiện ở cấp cao nhất của AChọnDanh sách đầu ra, ATrở vềDanh sáchinChèn/Cập nhật/Xóa, AGiá trịmệnh đềhoặc ATrình xây dựng hàng. Trong tất cả kèo bóng đá euro bối cảnh khác (bao gồm cả khi được lồng bên trong một trong kèo bóng đá euro cấu trúc đó), đính kèm.*thành giá trị tổng kèo bóng đá euro không thay đổi giá trị, vì nó có nghĩa làHồiTất cả kèo bóng đá euro cộtVà do đó, giá trị tổng kèo bóng đá euro tương tự được tạo lại. Ví dụ: nếuSOMEFUNC ()Chấp nhận đối số có giá trị tổng kèo bóng đá euro, các truy vấn này giống nhau:

Chọn một sốFunc (c.*) Từ incent_item c;
Chọn một sốFunc (c) từ incentory_item c;

Trong cả hai trường kèo bóng đá euro, hàng hiện tại củaInventory_Itemđược chuyển đến hàm như một đối số có giá trị tổng kèo bóng đá euro duy nhất. Mặc dù.*Không làm gì trong những trường kèo bóng đá euro như vậy, sử dụng nó là phong cách tốt, vì nó cho thấy rõ rằng giá trị tổng kèo bóng đá euro được dự định. Cụ thể, trình phân tích cú pháp sẽ xem xétCinc.*để chỉ tên bảng hoặc bí danh, không phải tên cột, do đó không có sự mơ hồ; vì không có.*, không rõ liệu liệuCCó nghĩa là tên bảng hoặc tên cột và trên thực tế, việc giải thích tên cột sẽ được ưu tiên nếu có một cột có tênC.

Một ví dụ khác chứng minh kèo bóng đá euro khái niệm này là tất cả kèo bóng đá euro truy vấn này có ý nghĩa giống nhau:

Chọn * từ Inventory_Item C Order của C;
Chọn * từ Inventory_Item C đặt hàng theo c. *;
Chọn * từ incentory_item c đơn hàng theo hàng (c. *);

Tất cả những điều nàyĐặt hàng bởiĐiều khoản chỉ định giá trị tổng kèo bóng đá euro của hàng, dẫn đến việc sắp xếp các hàng theo các quy tắc được mô tả trongPhần 9.24.6. Tuy nhiên, nếuInventory_Itemchứa một cột có tênC, trường kèo bóng đá euro đầu tiên sẽ khác với các trường kèo bóng đá euro khác, vì nó chỉ có nghĩa là sắp xếp theo cột đó. Cho các tên cột được hiển thị trước đó, các truy vấn này cũng tương đương với các truy vấn trên:

27162_27316

(Trường kèo bóng đá euro cuối cùng sử dụng hàm tạo hàng với từ khóahàngbỏ qua.)

Một hành vi cú pháp đặc biệt khác được liên kết với các giá trị tổng kèo bóng đá euro là chúng ta có thể sử dụngKý hiệu chức năngĐể trích xuất một trường có giá trị tổng kèo bóng đá euro. Cách đơn giản để giải thích điều này là các ký hiệutrường(Bảng)Bảng.trường27926_27992

Chọn C.Name từ Inventory_Item C trong đó C.Price 1000;
Chọn Tên (C) từ Inventory_Item C WHERE Giá (C) 1000;

Hơn nữa, nếu chúng ta có một hàm chấp nhận một đối số duy nhất của loại tổng kèo bóng đá euro, chúng ta có thể gọi nó với ký hiệu. Các truy vấn này đều tương đương:

28357_28487

28499_28632Trường được tính toán. Một ứng dụng sử dụng truy vấn cuối cùng ở trên sẽ không cần phải biết trực tiếp rằngSOMEFUNCkhông phải là một cột thực của bảng.

TIP

Vì hành vi này, không khôn ngoan khi đưa ra một hàm có một đối số loại tổng kèo bóng đá euro duy nhất tên giống như bất kỳ trường nào của loại tổng kèo bóng đá euro đó. Nếu có sự mơ hồ, việc giải thích tên trường sẽ được chọn nếu cú ​​pháp tên trường được sử dụng, trong khi hàm sẽ được chọn nếu sử dụng cú pháp gọi chức năng. Tuy nhiên,PostgreSQLPhiên bản trước 11 luôn chọn cách giải thích tên trường, trừ khi cú pháp của cuộc gọi yêu cầu nó là một cuộc gọi chức năng. Một cách để buộc giải thích chức năng trong kèo bóng đá euro phiên bản cũ hơn là trình độ Schema đủ điều kiện, nghĩa là viếtlược đồ.func(compositeValue).

8.16.6. Loại tổng kèo bóng đá euro đầu vào và cú pháp đầu ra

Biểu diễn văn bản bên ngoài của giá trị tổng kèo bóng đá euro bao gồm các mục được giải thích theo các quy tắc chuyển đổi I/O cho các loại trường riêng lẻ, cộng với trang trí cho biết cấu trúc tổng kèo bóng đá euro. Trang trí bao gồm dấu ngoặc đơn (()) xung quanh toàn bộ giá trị, cộng với dấu phẩy (,) giữa kèo bóng đá euro mục liền kề. Khoảng trắng bên ngoài dấu ngoặc đơn bị bỏ qua, nhưng trong kèo bóng đá euro dấu ngoặc đơn, nó được coi là một phần của giá trị trường và có thể hoặc không đáng kể tùy thuộc vào quy tắc chuyển đổi đầu vào cho loại dữ liệu trường. Ví dụ: trong:

'(42)'

khoảng trắng sẽ bị bỏ qua nếu loại trường là số nguyên, nhưng không phải nếu đó là văn bản.

Như được hiển thị trước đây, khi viết một giá trị tổng kèo bóng đá euro, bạn có thể viết trích dẫn kép xung quanh bất kỳ giá trị trường riêng lẻ nào. Bạnphải31112_31725

Một giá trị trường hoàn toàn trống (không có ký tự nào giữa dấu phẩy hoặc dấu ngoặc đơn) đại diện cho một null. Để viết một giá trị là một chuỗi trống chứ không phải null, hãy viết"".

31951_32264

Lưu ý

Hãy nhớ rằng những gì bạn viết trong lệnh SQL trước tiên sẽ được hiểu là một chuỗi theo nghĩa đen, và sau đó là một tổng kèo bóng đá euro. Điều này nhân đôi số lượng dấu trùng sinh bạn cần (giả sử cú pháp chuỗi thoát được sử dụng). Ví dụ: để chèn aTextTrường chứa báo giá kép và dấu gạch chéo ngược với giá trị tổng kèo bóng đá euro, bạn cần phải viết:

Chèn ... giá trị ('("\" \\ ")');

32775_32902("\" \ "). Lần lượt, chuỗi được đưa vàoTextthói quen đầu vào của loại dữ liệu trở thành"\. .byteaVí dụ, chúng ta có thể cần tới tám dấu gạch chéo ngược trong lệnh để đưa một dấu gạch chéo ngược vào trường tổng kèo bóng đá euro được lưu trữ.) Trích dẫn đô la (xemPhần 4.1.2.4) có thể được sử dụng để tránh sự cần thiết phải tăng gấp đôi dấu gạch chéo ngược.

TIP

Thehàng33659_33796hàng, Các giá trị trường riêng lẻ được viết giống như cách chúng được viết khi không phải là thành viên của tổng kèo bóng đá euro.

34841_34860

Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.