Các loại 롤 토토 vi là các loại dữ liệu đại diện cho một 롤 토토 vi các giá trị của một số loại phần tử (được gọi là 롤 토토 viSubType). Chẳng hạn, 롤 토토 vi củaDấu thời gian
có thể được sử dụng để thể hiện khoảng thời gian mà một phòng họp được bảo lưu. Trong trường hợp này, kiểu dữ liệu làtsrange
(viết tắt choDòng thời gianHồi) vàDấu thời gian
là phân nhóm. Loại phụ phải có tổng thứ tự để nó được xác định rõ liệu các giá trị phần tử có nằm trong, trước hoặc sau một 롤 토토 vi giá trị.
Các loại 롤 토토 vi rất hữu ích vì chúng đại diện cho nhiều giá trị phần tử trong một giá trị 롤 토토 vi duy nhất và bởi vì các khái niệm như 롤 토토 vi chồng chéo có thể được biểu thị rõ ràng. Việc sử dụng 롤 토토 vi thời gian và ngày cho mục đích lập lịch là ví dụ rõ ràng nhất; Nhưng 롤 토토 vi giá, đo lường từ một công cụ, v.v. cũng có thể hữu ích.
Mỗi loại 롤 토토 vi có loại đa dạng tương ứng. Multirange là một danh sách được đặt hàng của các 롤 토토 vi không liên tục, không trống, không khống. Hầu hết các nhà khai thác 롤 토토 vi cũng hoạt động trên nhiều thứ khác và họ có một vài chức năng của riêng họ.
PostgreSQL đi kèm với các loại 롤 토토 vi tích hợp sau:
int4range
- 롤 토토 viSố nguyên
, int4multirange
- Multirange tương ứng
int8range
- 롤 토토 viBigint
, int8multirange
- Multirange tương ứng
numrange
- 롤 토토 viSố
, nummultirange
- Multirange tương ứng
tsrange
- 롤 토토 vidấu thời gian không có múi giờ
, tsmultirange
- Multirange tương ứng
tstzrange
- 롤 토토 vidấu thời gian với múi giờ
, tstzmultirange
- Multirange tương ứng
Daterange
- 롤 토토 vingày
, Datemultirange
- Multirange tương ứng
Ngoài ra, bạn có thể xác định các loại 롤 토토 vi của riêng bạn; nhìn thấyTạo loạiĐể biết thêm thông tin.
Tạo đặt phòng bảng (phòng int, trong thời gian tsrange); Chèn vào giá trị đặt phòng (1108, '[2010-01-01 14:30, 2010-01-01 15:30)'); - ngăn chặn Chọn Int4Range (10, 20) @ 3; - Sự chồng chéo Chọn numrange (11.1, 22.2) && numrange (20.0, 30.0); - Trích xuất giới hạn trên Chọn trên (int8range (15, 25)); - Tính toán giao lộ Chọn int4range (10, 20) * int4range (15, 25); - 롤 토토 vi có trống không? Chọn isempty (numrange (1, 5));
xemBảng 9.56vàBảng 9.58Để biết danh sách đầy đủ các toán tử và chức năng trên các loại phạm vi.
Mỗi phạm vi không trống có hai giới hạn, giới hạn dưới và giới hạn trên. Tất cả các điểm giữa các giá trị này được bao gồm trong phạm vi. Một giới hạn bao gồm có nghĩa là chính điểm biên cũng được bao gồm trong phạm vi, trong khi giới hạn độc quyền có nghĩa là điểm biên không được bao gồm trong phạm vi.
Ở dạng văn bản của một 롤 토토 vi, giới hạn dưới bao gồm được biểu thị bằng[
”Trong khi giới hạn dưới độc quyền được biểu thị bằng(
Hồi. Tương tự như vậy, giới hạn trên bao gồm được biểu thị bằng]
, trong khi giới hạn trên độc quyền được biểu diễn bởi)
. (Nhìn thấyPhần 8.17.5Để biết thêm chi tiết.)
Các chức năngLower_inc
vàUpper_inc
Kiểm tra tính bao gồm của giới hạn dưới và trên của giá trị phạm vi, tương ứng.
Giới hạn dưới của một 롤 토토 vi có thể được bỏ qua, có nghĩa là tất cả các giá trị nhỏ hơn giới hạn trên được bao gồm trong 롤 토토 vi, ví dụ:(, 3]
. Tương tự như vậy, nếu giới hạn trên của phạm vi bị bỏ qua, thì tất cả các giá trị lớn hơn giới hạn dưới được bao gồm trong phạm vi. Nếu cả giới hạn dưới và trên đều bị bỏ qua, tất cả các giá trị của loại phần tử được coi là nằm trong phạm vi. Chỉ định một giới hạn bị thiếu là bao gồm được tự động chuyển đổi thành độc quyền, ví dụ:[,]
được chuyển đổi thành(,)
. Bạn có thể nghĩ về các giá trị bị thiếu này là +/- Infinity, nhưng chúng là các giá trị loại phạm vi đặc biệt và được coi là vượt xa mọi giá trị +/- Infinity của loại phạm vi.
Các loại phần tử có khái niệmVô cựcHồiCó thể sử dụng chúng làm giá trị ràng buộc rõ ràng. Ví dụ: với 롤 토토 vi dấu thời gian,[hôm nay, vô cực)
không bao gồm đặc biệtdấu thời gian
giá trịVô cực
, trong khi[Hôm nay, Infinity]
Bao gồm nó, cũng như[hôm nay,)
và[Hôm nay,]
.
Các chức năngLower_inf
vàUpper_inf
Kiểm tra cho giới hạn thấp hơn và trên của phạm vi, tương ứng.
Đầu vào cho giá trị phạm vi phải tuân theo một trong các mẫu sau:
(giới hạn thấp hơn
,giới hạn trên
) (giới hạn thấp hơn
,giới hạn trên
] [giới hạn thấp hơn
,giới hạn trên
) [giới hạn thấp hơn
,giới hạn trên
] trống
dấu ngoặc đơn hoặc dấu ngoặc cho biết liệu giới hạn dưới và trên là độc quyền hay bao gồm, như được mô tả trước đây. Lưu ý rằng mẫu cuối cùng làtrống
, đại diện cho một phạm vi trống (một phạm vi không chứa điểm).
Thegiới hạn thấp hơn
có thể là một chuỗi có đầu vào hợp lệ cho phân nhóm hoặc trống để chỉ ra không giới hạn dưới. Tương tự như vậy,giới hạn trên
có thể là một chuỗi có đầu vào hợp lệ cho phân nhóm hoặc trống để chỉ ra không giới hạn trên.
mỗi giá trị ràng buộc có thể được trích dẫn bằng cách sử dụng"
(trích dẫn kép) ký tự. Điều này là cần thiết nếu giá trị ràng buộc chứa dấu ngoặc đơn, dấu ngoặc, dấu phẩy, dấu ngoặc kép hoặc dấu gạch chéo ngược, vì các ký tự này sẽ được coi là một phần của cú pháp phạm vi. Để đặt một báo giá kép hoặc dấu gạch chéo ngược trong một giá trị ràng buộc được trích dẫn, đi trước nó với một dấu gạch chéo ngược. . Ngoài ra, để viết một giá trị ràng buộc là một chuỗi trống, viết""
, vì viết không có gì có nghĩa là một ràng buộc vô hạn.
khoảng trắng được cho phép trước và sau giá trị phạm vi, nhưng bất kỳ khoảng trắng nào giữa dấu ngoặc hoặc dấu ngoặc được lấy làm một phần của giá trị giới hạn dưới hoặc trên. (Tùy thuộc vào loại phần tử, nó có thể hoặc không đáng kể.)
Các quy tắc này rất giống với các quy tắc để viết các giá trị trường trong các chữ loại tổng hợp. Nhìn thấyPhần 8.16.6Để bình luận bổ sung.
ví dụ:
- Bao gồm 3, không bao gồm 7 và bao gồm tất cả các điểm ở giữa Chọn '[3,7)' :: int4range; - không bao gồm 3 hoặc 7, nhưng bao gồm tất cả các điểm ở giữa Chọn '(3,7)' :: int4range; - Chỉ bao gồm điểm đơn 4 Chọn '[4,4]' :: int4range; - Bao gồm không có điểm (và sẽ được chuẩn hóa thành 'trống')) Chọn '[4,4)' :: int4range;
Đầu vào cho đa số là dấu ngoặc xoăn (và
) chứa các phạm vi không có hoặc nhiều hơn, được phân tách bằng dấu phẩy. Whitespace được phép xung quanh dấu ngoặc và dấu phẩy. Điều này được dự định sẽ gợi nhớ đến cú pháp mảng, mặc dù đa ảo đơn giản hơn nhiều: chúng chỉ có một chiều và không cần phải trích dẫn nội dung của chúng. (Tuy nhiên, giới hạn của phạm vi của chúng có thể được trích dẫn như trên.)
ví dụ:
Chọn '' :: int4Multirange; Chọn '[3,7)' :: int4Multirange; Chọn '[3,7), [8,9)' :: int4multirange;
Mỗi loại phạm vi có hàm hàm tạo có cùng tên với loại phạm vi. Sử dụng hàm hàm tạo thường thuận tiện hơn so với việc viết một hằng số theo nghĩa đen, vì nó tránh được sự cần thiết phải trích dẫn thêm các giá trị bị ràng buộc. Chức năng của hàm tạo chấp nhận hai hoặc ba đối số. Mẫu hai đối số xây dựng một phạm vi ở dạng tiêu chuẩn (bao gồm giới hạn dưới, độc quyền giới hạn trên), trong khi biểu mẫu ba đối tượng xây dựng một phạm vi với giới hạn của biểu mẫu được chỉ định bởi đối số thứ ba. Đối số thứ ba phải là một trong các chuỗi()
Hồi, (]
Hồi, Hồi[)
HồihoặcMạnh[]
Hồi. Ví dụ:
- Hình thức đầy đủ là: giới hạn dưới, giới hạn trên và đối số văn bản cho biết - Tính bao gồm/độc quyền của giới hạn. Chọn numrange (1.0, 14.0, '(]'); - Nếu đối số thứ ba bị bỏ qua, '[)' được giả định. Chọn numrange (1.0, 14.0); - mặc dù '(]' được chỉ định ở đây, trên hiển thị, giá trị sẽ được chuyển đổi thành - Hình thức kinh điển, vì Int8Range là loại phạm vi riêng biệt (xem bên dưới). Chọn int8range (1, 14, '(]'); - Sử dụng NULL cho một trong hai giới hạn khiến phạm vi không bị ràng buộc ở phía đó. Chọn numrange (null, 2.2);
Mỗi loại phạm vi cũng có một hàm tạo đa dạng có cùng tên với loại đa loại. Hàm hàm tạo không có hoặc nhiều đối số là tất cả các phạm vi của loại thích hợp. Ví dụ:
chọn nummultirange (); Chọn nummultirange (numrange (1.0, 14.0)); Chọn NumMultirange (NumRange (1.0, 14.0), NumRange (20.0, 25.0));
롤 토토 vi riêng biệt là một loại có loại phần tử có được xác định rõMạnhBướcVoi, chẳng hạn nhưSố nguyên
hoặcngày
. Trong các loại này, hai yếu tố có thể nói là liền kề, khi không có giá trị hợp lệ giữa chúng. Điều này tương phản với các phạm vi liên tục, trong đó nó luôn luôn (hoặc hầu như luôn luôn) có thể xác định các giá trị phần tử khác giữa hai giá trị đã cho. Ví dụ: một phạm vi trênSố
Loại liên tục, như là một 롤 토토 vi trêndấu thời gian
. (Mặc dùdấu thời gian
Có độ chính xác hạn chế, và về mặt lý thuyết có thể được coi là rời rạc, tốt hơn là xem xét nó liên tục vì kích thước bước thường không được quan tâm.)
Một cách khác để suy nghĩ về một loại phạm vi riêng biệt là có một ý tưởng rõ ràng về AHồiNEXThoặcTrướcHồiGiá trị cho mỗi giá trị phần tử. Biết rằng, có thể chuyển đổi giữa các biểu diễn bao gồm và độc quyền của giới hạn phạm vi, bằng cách chọn giá trị phần tử tiếp theo hoặc trước đó thay vì giá trị ban đầu. Ví dụ: trong loại phạm vi số nguyên[4,8]
và(3,9)
biểu thị cùng một tập hợp các giá trị; nhưng điều này sẽ không như vậy đối với một phạm vi trên số.
Một loại 롤 토토 vi rời rạc phải cóCanonicalizationHàm nhận thức được kích thước bước mong muốn cho loại phần tử. Hàm Canonicalization được tính phí chuyển đổi các giá trị tương đương của loại phạm vi để có các biểu diễn giống hệt nhau, đặc biệt là giới hạn bao gồm hoặc độc quyền. Nếu một hàm chính trị không được chỉ định, thì các phạm vi với định dạng khác nhau sẽ luôn được coi là không đồng đều, mặc dù chúng có thể đại diện cho cùng một tập hợp các giá trị trong thực tế.
Các loại 롤 토토 vi tích hợpint4range
, int8range
vàDaterange
Tất cả sử dụng một hình thức kinh điển bao gồm giới hạn dưới và loại trừ giới hạn trên; đó là,[)
. Tuy nhiên, các loại 롤 토토 vi do người dùng xác định có thể sử dụng các quy ước khác.
Người dùng có thể xác định các loại phạm vi của riêng họ. Lý do phổ biến nhất để làm điều này là sử dụng các phạm vi trên các phân nhóm không được cung cấp trong số các loại phạm vi tích hợp. Ví dụ: để xác định một loại phân nhóm mớifloat8
:
Tạo loại floatrange dưới dạng phạm vi ( phân nhóm = float8, SubType_Diff = float8mi ); Chọn '[1.234, 5.678]' :: floatrange;
vìfloat8
không có ý nghĩaBướcHàng, chúng tôi không xác định chức năng chính tắc hóa trong ví dụ này.
Khi bạn xác định 롤 토토 vi của riêng mình, bạn sẽ tự động nhận được một loại đa dạng tương ứng.
27029_27237
Nếu phân nhóm được coi là có giá trị riêng biệt thay vì các giá trị liên tục,Tạo loại
lệnh phải chỉ định ACanonical
Hàm. Hàm Canonicalization có giá trị phạm vi đầu vào và phải trả về giá trị phạm vi tương đương có thể có giới hạn và định dạng khác nhau. Đầu ra chính tắc cho hai phạm vi đại diện cho cùng một tập hợp các giá trị, ví dụ như phạm vi số nguyên[1, 7]
và[1, 8)
, phải giống hệt nhau. Không quan trọng bạn chọn cách đại diện nào là chính thức, miễn là hai giá trị tương đương với các định dạng khác nhau luôn được ánh xạ tới cùng một giá trị với cùng một định dạng. Ngoài việc điều chỉnh định dạng giới hạn bao gồm/độc quyền, chức năng chính trị hóa có thể làm tròn các giá trị ranh giới, trong trường hợp kích thước bước mong muốn lớn hơn so với những gì phân nhóm có khả năng lưu trữ. Chẳng hạn, loại phạm vi trênDấu thời gian
28266_28463
28473_28596SubType_Diff
, chức năng. (Chỉ mục vẫn sẽ hoạt động mà không cóSubType_Diff
, nhưng nó có khả năng kém hiệu quả hơn đáng kể so với khi hàm khác biệt được cung cấp.) Hàm chênh lệch phân nhóm có hai giá trị đầu vào của phân nhóm và trả về sự khác biệt của chúng (nghĩa là,x
trừY
) được biểu diễn dưới dạngfloat8
Giá trị. Trong ví dụ của chúng tôi ở trên, hàmfloat8mi
Điều đó làm cơ sở cho thông thườngfloat8
Có thể sử dụng toán tử trừ; Nhưng đối với bất kỳ loại phụ nào khác, một số loại chuyển đổi sẽ là cần thiết. Một số suy nghĩ sáng tạo về làm thế nào để thể hiện sự khác biệt khi các con số cũng có thể cần thiết. Đến mức lớn nhất có thể,SubType_Diff
Hàm nên đồng ý với thứ tự sắp xếp được ngụ ý bởi lớp toán tử được chọn và đối chiếu; nghĩa là, kết quả của nó sẽ tích cực bất cứ khi nào đối số đầu tiên của nó lớn hơn thứ hai theo thứ tự sắp xếp.
Một ví dụ ít kích thích của ASubType_Diff
Hàm là:
29840_30110
xemTạo loạiĐể biết thêm thông tin về việc tạo các loại phạm vi.
Các chỉ mục GIST và SP-GIST có thể được tạo cho các cột bảng của các loại phạm vi. Các chỉ mục GIST cũng có thể được tạo cho các cột bảng của nhiều loại. Chẳng hạn, để tạo chỉ mục GIST:
30848_30916
Chỉ số sp-gist trên 롤 토토 vi có thể tăng tốc các truy vấn liên quan đến các toán tử 롤 토토 vi này:=
, &&
, <@
, @
, <<
, ,
-|-
, &<
và&
. Một chỉ mục GIST trên đa ảo có thể tăng tốc các truy vấn liên quan đến cùng một bộ toán tử đa dạng. Một chỉ mục GIST trên các phạm vi và chỉ mục GIST trên đa ảo cũng có thể tăng tốc các truy vấn liên quan đến phạm vi loại chéo này lên đa phương tiện và đa hóa thành các toán tử phạm vi tương ứng:&&
, <@
, @
, <<
, ,
-|-
, &<
và&
. Nhìn thấyBảng 9.56Để biết thêm thông tin.
Ngoài ra, các chỉ mục b-cây và băm có thể được tạo cho các cột bảng của các loại phạm vi. Đối với các loại chỉ mục này, về cơ bản, hoạt động phạm vi hữu ích duy nhất là bình đẳng. Có một thứ tự sắp xếp B-cây được xác định cho các giá trị phạm vi, với tương ứng<
vàNgười vận hành, nhưng đặt hàng khá tùy tiện và thường không hữu ích trong thế giới thực. Hỗ trợ b-cây và băm của các loại phạm vi chủ yếu có nghĩa là cho phép phân loại và băm nội tâm trong các truy vấn, thay vì tạo các chỉ mục thực tế.
trong khiđộc đáo
là một ràng buộc tự nhiên cho các giá trị vô hướng, nó thường không phù hợp với các loại phạm vi. Thay vào đó, một ràng buộc loại trừ thường phù hợp hơn (xemTạo bảng ... ràng buộc ... loại trừ). Các ràng buộc loại trừ cho phép đặc tả các ràng buộc nhưKhông chồng chéoKhănTrên một loại phạm vi. Ví dụ:
Tạo đặt phòng bảng ( trong thời gian tsrange, Loại trừ bằng cách sử dụng gist (trong thời gian với &&) );
Ràng buộc đó sẽ ngăn bất kỳ giá trị chồng chéo nào tồn tại trong bảng cùng một lúc:
Chèn vào các giá trị đặt phòng ('[2010-01-01 11:30, 2010-01-01 15:00)'); Chèn 0 1 Chèn vào giá trị đặt phòng ('[2010-01-01 14:45, 2010-01-01 15:45)'); Lỗi: Giá trị khóa mâu thuẫn vi phạm ràng buộc loại trừ "reservation_during_excl" Chi tiết: khóa (trong) = (["2010-01-01 14:45:00", "2010-01-01 15:45:00")) Xung đột với khóa hiện có (trong) = (["2010-01-01 11:30:00", "2010-01-01 15:00:00")).
Bạn có thể sử dụngbtree_gist
Mở rộng để xác định các ràng buộc loại trừ trên các loại dữ liệu vô hướng đơn giản, sau đó có thể được kết hợp với các loại trừ phạm vi để linh hoạt tối đa. Ví dụ, saubtree_gist
Được cài đặt, ràng buộc sau đây sẽ từ chối các 롤 토토 vi chồng chéo chỉ khi số phòng họp bằng nhau:
Tạo phần mở rộng btree_gist; Tạo bảng phòng_reservation ( văn bản phòng, trong thời gian tsrange, Loại trừ bằng cách sử dụng Gist (phòng với =, trong thời gian với &&) ); Chèn vào các giá trị của Room_Reservation ('123a', '[2010-01-01 14:00, 2010-01-01 15:00)'); Chèn 0 1 Chèn vào các giá trị của Room_Reservation ('123a', '[2010-01-01 14:30, 2010-01-01 15:30)'); Lỗi: Giá trị khóa xung đột vi phạm ràng buộc loại trừ "Room_Reservation_room_During_Excl" Chi tiết: khóa (phòng, trong) = (123a, ["2010-01-01 14:30:00", "2010-01-01 15:30:00")) với khóa hiện có (phòng, trong) = (123a, ["2010-01-01 14:00:00", "2010-01-01 15:00:00")). Chèn vào các giá trị của Room_Reservation ('123b', '[2010-01-01 14:30, 2010-01-01 15:30)'); Chèn 0 1
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.