F.17. 토토 꽁 머니 - 토토 꽁 머니 KEY/GIÁ TRỊ DATATATY#

Mô -đun này thực hiện토토 꽁 머니Kiểu dữ liệu để lưu trữ các bộ khóa/giá trị trong mộtPostgreSQLGiá trị. Điều này có thể hữu ích trong các kịch bản khác nhau, chẳng hạn như các hàng có nhiều thuộc tính hiếm khi được kiểm tra hoặc dữ liệu bán cấu trúc. Các khóa và giá trị chỉ đơn giản là chuỗi văn bản.

Mô -đun này được coi làHồiTrustedHồi, nghĩa là, nó có thể được cài đặt bởi những người không phải là người siêu giám sát cóTạoĐặc quyền trên cơ sở dữ liệu hiện tại.

F.17.1. 토토 꽁 머니Đại diện bên ngoài#

Biểu diễn văn bản của토토 꽁 머니, được sử dụng cho đầu vào và đầu ra, bao gồm không hoặc nhiều hơnKey = giá trịcặp được phân tách bằng dấu phẩy. Một số ví dụ:

K = V.
foo = thanh, baz = bất cứ điều gì
"1-a" = "bất cứ điều gì ở tất cả"

Thứ tự của các cặp không đáng kể (và có thể không được sao chép trên đầu ra). Khoảng trắng giữa các cặp hoặc xung quanh=Dấu hiệu bị bỏ qua. Các phím và giá trị trích dẫn kép bao gồm khoảng trắng, dấu phẩy,=S hoặcs. Để bao gồm một báo giá kép hoặc dấu gạch chéo ngược trong một khóa hoặc giá trị, hãy thoát nó bằng một dấu gạch chéo ngược.

mỗi khóa trong một토토 꽁 머니là duy nhất. Nếu bạn khai báo토토 꽁 머니Với các khóa trùng lặp, chỉ có một cái sẽ được lưu trữ trong토토 꽁 머니Và không có gì đảm bảo sẽ được giữ:

Chọn 'a = 1, a = 2' :: 토토 꽁 머니;
  hstore
----------
 "A" = "1"

Một giá trị (nhưng không phải là khóa) có thể là SQLnull. Ví dụ:

key = null

ThenullTừ khóa không nhạy cảm với trường hợp. Hai phần trích dẫnnullĐể coi nó là chuỗi thông thườngnullxông.

Lưu ý

Hãy nhớ rằng토토 꽁 머니Định dạng văn bản, khi được sử dụng cho đầu vào, áp dụngtrướcBất kỳ trích dẫn hoặc thoát yêu cầu nào. Nếu bạn đang vượt qua토토 꽁 머니theo nghĩa đen thông qua một tham số, sau đó không cần xử lý bổ sung. Nhưng nếu bạn đang chuyển nó dưới dạng hằng số theo nghĩa đen được trích dẫn, thì bất kỳ ký tự nào một cách nào và (tùy thuộc vào cài đặt củaStandard_Conforming_StringsTham số cấu hình) Các ký tự Backslash cần được thoát chính xác. Nhìn thấyPhần 4.1.2.1Để biết thêm về việc xử lý các hằng số chuỗi.

Trên đầu ra, báo giá đôi luôn bao quanh các khóa và giá trị, ngay cả khi nó không hoàn toàn cần thiết.

F.17.2. 토토 꽁 머니toán tử và chức năng#

Các toán tử được cung cấp bởi토토 꽁 머니Mô -đun được hiển thị trongBảng F.6, các chức năng trongBảng F.7.

Bảng F.6. 토토 꽁 머니toán tử

Nhà điều hành

Mô tả

Ví dụ

토토 꽁 머니 - TextText

Trả về giá trị được liên kết với phím đã cho hoặcnullNếu không có.

'a = x, b = y' :: 토토 꽁 머니 - 'a'x

토토 꽁 머니 - Text []Text []

Trả về các giá trị được liên kết với các khóa đã cho hoặcnullNếu không có.

'a = x, b = y, c = z' :: 토토 꽁 머니 - mảng ['c', 'a']"z", "x"

토토 꽁 머니 || 토토 꽁 머니토토 꽁 머니

Concatenates Hai토토 꽁 머니s.

'a = b, c = d' :: hstore || 'c = x, d = q' :: hstore"A" = "B", "C" = "X", "D" = "Q"

토토 꽁 머니 ? TextBoolean

không토토 꽁 머니chứa khóa?

'A = 1' :: 토토 꽁 머니? 'Một'T

토토 꽁 머니 ? & Text []Boolean

không토토 꽁 머니chứa tất cả các khóa được chỉ định?

'a = 1, b = 2' :: 토토 꽁 머니? & Array ['A', 'B']T

토토 꽁 머니 ? | Text []Boolean

không토토 꽁 머니chứa bất kỳ khóa nào được chỉ định?

'a = 1, b = 2' :: 토토 꽁 머니? | Mảng ['b', 'c']T

토토 꽁 머니 @ 토토 꽁 머니Boolean

Vận hành bên trái có chứa phải không?

'a = b, b = 1, c = null' :: hstore @ 'b = 1'T

토토 꽁 머니 <@ 토토 꽁 머니Boolean

là toán hạng bên trái có ở bên phải?

'A = C' :: 토토 꽁 머니 <@ 'a = B, b = 1, c = null'f

토토 꽁 머니 - Text토토 꽁 머니

Xóa phím khỏi toán hạng bên trái.

'a = 1, b = 2, c = 3' :: 토토 꽁 머니 - 'b' :: text"A" = "1", "C" = "3"

토토 꽁 머니 - Text []토토 꽁 머니

Xóa các phím từ toán hạng bên trái.

'a = 1, b = 2, c = 3' :: 토토 꽁 머니 - mảng ['a', 'b']"C" = "3"

토토 꽁 머니 - 토토 꽁 머니토토 꽁 머니

Xóa các cặp từ toán hạng bên trái phù hợp với các cặp trong toán hạng bên phải.

'a = 1, b = 2, c = 3' :: 토토 꽁 머니 - 'a = 4, b = 2' :: 토토 꽁 머니"A" = "1", "C" = "3"

AnyEuity #= 토토 꽁 머니AnyEuity

Thay thế các trường trong toán hạng bên trái (phải là loại tổng hợp) với các giá trị phù hợp từ토토 꽁 머니.

hàng (1,3) #= 'f1 = 11' :: hstore(11,3)

%% 토토 꽁 머니Text []

Chuyển đổi토토 꽁 머니đến một mảng các khóa và giá trị xen kẽ.

%% 'a = foo, b = bar' :: hstorea, foo, b, bar

%# 토토 꽁 머니Text []

Chuyển đổi토토 꽁 머니đến mảng khóa/giá trị hai chiều.

%# 'a = foo, b = bar' :: hstorea, foo, b, bar


Bảng F.7. 토토 꽁 머니Chức năng

chức năng

Mô tả

Ví dụ

토토 꽁 머니(Record) →토토 꽁 머니

Xây dựng một토토 꽁 머니Từ bản ghi hoặc hàng.

토토 꽁 머니 (hàng (1,2))"f1" = "1", "f2" = "2"

토토 꽁 머니(Text []) →토토 꽁 머니

Xây dựng một토토 꽁 머니Từ một mảng, có thể là mảng khóa/giá trị hoặc mảng hai chiều.

토토 꽁 머니 (mảng ['A', '1', 'B', '2'])"A" = "1", "B" = "2"

토토 꽁 머니 (mảng [['c', '3'], ['d', '4']])"C" = "3", "d" = "4"

토토 꽁 머니(Text [], Text []) →토토 꽁 머니

Xây dựng một토토 꽁 머니Từ các mảng khóa và giá trị riêng biệt.

토토 꽁 머니 (mảng ['a', 'b'], mảng ['1', '2'])"A" = "1", "B" = "2"

토토 꽁 머니(Text, Text) →토토 꽁 머니

làm cho một mục đơn토토 꽁 머니.

토토 꽁 머니 ('A', 'B')"A" = "B"

AKEYS(토토 꽁 머니) →Text []

trích xuất một토토 꽁 머니's Phím dưới dạng mảng.

akeys ('a = 1, b = 2')a, b

SKEYS(토토 꽁 머니) →Setof Text

trích xuất một토토 꽁 머니S phím như một tập hợp.

SKEYS ('A = 1, B = 2')

a
B

Avals(토토 꽁 머니) →Text []

trích xuất một토토 꽁 머니s giá trị dưới dạng mảng.

Avals ('a = 1, b = 2')1,2

svals(토토 꽁 머니) →Setof Text

trích xuất một토토 꽁 머니s giá trị như một tập hợp.

svals ('a = 1, b = 2')

1
2

토토 꽁 머니_to_array(토토 꽁 머니) →Text []

trích xuất một토토 꽁 머니'của các phím và giá trị dưới dạng một mảng các khóa và giá trị xen kẽ.

토토 꽁 머니_to_array ('a = 1, b = 2')a, 1, b, 2

토토 꽁 머니_to_matrix(토토 꽁 머니) →Text []

trích xuất một토토 꽁 머니S phí và giá trị dưới dạng mảng hai chiều.

토토 꽁 머니_to_matrix ('a = 1, b = 2')a, 1, b, 2

토토 꽁 머니_to_json(토토 꽁 머니) →json

Chuyển đổi một토토 꽁 머니đến AjsonGiá trị, chuyển đổi tất cả các giá trị không null thành chuỗi JSON.

Hàm này được sử dụng ngầm khi토토 꽁 머니Giá trị được đúc thànhjson.

"A Key": "1", "B": "T", "C": NULL, "D": "12345", "E": "012345", "F": "1.234"

토토 꽁 머니_to_jsonb(토토 꽁 머니) →jsonb

Chuyển đổi một토토 꽁 머니đến AJSONBGiá trị, chuyển đổi tất cả các giá trị không null thành chuỗi JSON.

Hàm này được sử dụng ngầm khi토토 꽁 머니Giá trị được đúc thànhJSONB.

"A Key": "1", "B": "T", "C": NULL, "D": "12345", "E": "012345", "F": "1.234"

토토 꽁 머니_TO_JSON_LOOSE(토토 꽁 머니) →json

Chuyển đổi một토토 꽁 머니đến AJSONGiá trị, nhưng cố gắng phân biệt các giá trị số và boolean để chúng không được trích xuất trong JSON.

"A Key": 1, "B": True, "C": NULL, "D": 12345, "E": "012345", "F": 1.234, "G"

HSTORE_TO_JSONB_LOOSE(토토 꽁 머니) →jsonb

Chuyển đổi một토토 꽁 머니đến AJSONBGiá trị, nhưng cố gắng phân biệt các giá trị số và boolean để chúng không được trích xuất trong JSON.

"A Key": 1, "B": True, "C": NULL, "D": 12345, "E": "012345"

Slice(토토 꽁 머니, Text []) →토토 꽁 머니

Trích xuất một tập hợp con토토 꽁 머니Chỉ chứa các khóa được chỉ định.

Slice ('a = 1, b = 2, c = 3' :: hstore, mảng ['b', 'c', 'x'])"B" = "2", "C" = "3"

mỗi(토토 꽁 머니) →Setof Record(Key Text, giá trị Text)

trích xuất một토토 꽁 머니'các phím và giá trị như một tập hợp các bản ghi.

Chọn * từ mỗi ('a = 1, b = 2')

khóa | giá trị
-----+-------
 A | 1
 B | 2

tồn tại(토토 꽁 머니, Text) →Boolean

do토토 꽁 머니chứa khóa?

tồn tại ('a = 1', 'a')T

Xác định(토토 꽁 머니, Text) →Boolean

do토토 꽁 머니chứa khôngnullGiá trị cho khóa?

Xác định ('a = null', 'a')f

Xóa(토토 꽁 머니, Text) →토토 꽁 머니

Xóa cặp với phím khớp.

Xóa ('A = 1, B = 2', 'B')"A" = "1"

Xóa(토토 꽁 머니, Text []) →토토 꽁 머니

Xóa các cặp với các phím phù hợp.

Xóa ('a = 1, b = 2, c = 3', mảng ['a', 'b'])"C" = "3"

Xóa(토토 꽁 머니, 토토 꽁 머니) →토토 꽁 머니

Xóa các cặp khớp với các cặp trong đối số thứ hai.

Xóa ('a = 1, b = 2', 'a = 4, b = 2' :: hstore)"A" = "1"

Population_Record(AnyEuity, 토토 꽁 머니) →AnyEuity

Thay thế các trường trong toán hạng bên trái (phải là loại tổng hợp) với các giá trị phù hợp từ토토 꽁 머니.

population_record (hàng (1,2), 'f1 = 42' :: hstore)(42,2)


Ngoài các toán tử và chức năng này, các giá trị của토토 꽁 머니Loại có thể được đăng ký, cho phép chúng hoạt động như các mảng kết hợp. Chỉ một chỉ số duy nhất của loạiTextcó thể được chỉ định; Nó được hiểu là một khóa và giá trị tương ứng được tìm nạp hoặc lưu trữ. Ví dụ,

Tạo bảng mytable (h hstore);
Chèn vào các giá trị mytable ('a = b, c = d');
Chọn H ['A'] từ MyTable;
 h
---
 b
(1 hàng)

Cập nhật MyTable Set H ['C'] = 'Mới';
Chọn H từ mytable;
          h
--------------------------
 "A" = "B", "C" = "Mới"
(1 hàng)

Một lần tìm kiếm được đăng kýnullNếu chỉ số lànullhoặc khóa đó không tồn tại trong토토 꽁 머니. .-Nhà điều hành.) Một bản cập nhật được đăng ký không thành công nếu chỉ số lànull; Nếu không, nó thay thế giá trị cho khóa đó, thêm một mục vào토토 꽁 머니Nếu khóa chưa tồn tại.

F.17.3. Chỉ mục#

토토 꽁 머니Hỗ trợ Chỉ số Gist và Gin cho@, ?, ? &? |Người vận hành. Ví dụ:

Tạo chỉ mục HIDX trên Testhstore bằng Gist (h);

Tạo chỉ mục HIDX trên Testhstore bằng Gin (H);

gist_토토 꽁 머니_opsGIST OPCLASS xấp xỉ một tập hợp các cặp khóa/giá trị dưới dạng chữ ký bitmap. Tham số số nguyên tùy chọn của nóSiglenXác định độ dài chữ ký trong byte. Độ dài mặc định là 16 byte. Các giá trị hợp lệ của độ dài chữ ký nằm trong khoảng từ 1 đến 2024 byte. Chữ ký dài hơn dẫn đến một tìm kiếm chính xác hơn (quét một phần nhỏ hơn của chỉ mục và ít trang đống hơn), với chi phí của một chỉ số lớn hơn.

Ví dụ về việc tạo một chỉ mục như vậy với độ dài chữ ký là 32 byte:

40296_40374

토토 꽁 머니cũng hỗ trợBtreehoặc​​HashChỉ mục cho=toán tử. Điều này cho phép토토 꽁 머니cột được khai báođộc đáohoặc được sử dụng trongNhóm bởi, Đặt hàng bởihoặckhác biệtBiểu thức. Thứ tự sắp xếp cho토토 꽁 머니Giá trị không đặc biệt hữu ích, nhưng các chỉ mục này có thể hữu ích cho các tra cứu tương đương. Tạo chỉ mục cho=so sánh như sau:

Tạo chỉ mục HIDX trên Testhstore bằng Btree (h);

Tạo chỉ mục HIDX trên Testhstore bằng băm (h);

F.17.4. Ví dụ#

Thêm khóa hoặc cập nhật khóa hiện có có giá trị mới:

Tab Cập nhật đặt H ['C'] = '3';

Một cách khác để làm điều tương tự là:

Tab Cập nhật đặt H = H || hstore ('c', '3');

Nếu nhiều khóa được thêm hoặc thay đổi trong một thao tác, phương pháp nối tiếp tục hơn so với đăng ký:

Tab Cập nhật đặt H = H || hstore (mảng ['q', 'w'], mảng ['11 ',' 12 ']);

Xóa khóa:

Tab Update Set H = Delete (h, 'K1');

Chuyển đổi ARecordđến một토토 꽁 머니:

Tạo thử nghiệm bảng (số nguyên col1, văn bản col2, văn bản col3);
Chèn vào các giá trị kiểm tra (123, 'foo', 'thanh');

Chọn HStore (T) từ thử nghiệm là T;
                   hstore
-------------------------------------------------
 "col1" = "123", "col2" = "foo", "col3" = "bar"
(1 hàng)

Chuyển đổi một토토 꽁 머니đến được xác định trướcRecordloại:

Tạo thử nghiệm bảng (số nguyên col1, văn bản col2, văn bản col3);

Chọn * Từ population_record (null :: test,
                              '"col1" = "456", "col2" = "zzz"');
 col1 | col2 | col3
------+------+------
  456 | zzz |
(1 hàng)

Sửa đổi bản ghi hiện có bằng cách sử dụng các giá trị từ토토 꽁 머니:

Tạo thử nghiệm bảng (số nguyên col1, văn bản col2, văn bản col3);
Chèn vào các giá trị kiểm tra (123, 'foo', 'thanh');

Chọn (r).* Từ (chọn t #= '"col3" = "Baz"' làm r từ thử nghiệm t) s;
 col1 | col2 | col3
------+------+------
  123 | foo | Baz
(1 hàng)

F.17.5. Thống kê#

The토토 꽁 머니Loại, vì tính tự do nội tại của nó, có thể chứa rất nhiều khóa khác nhau. Kiểm tra các khóa hợp lệ là nhiệm vụ của ứng dụng. Các ví dụ sau đây chứng minh một số kỹ thuật để kiểm tra các khóa và có được số liệu thống kê.

Ví dụ đơn giản:

Chọn * từ mỗi ('aaa = bq, b = null, "" = 1');

Sử dụng bảng:

Tạo chỉ số bảng là chọn (mỗi (h)).

Thống kê trực tuyến:

Chọn khóa, đếm (*) từ
  (Chọn (mỗi (h)). Khóa từ Testhstore) làm chỉ số
  Nhóm theo khóa
  Đặt hàng theo đếm desc, khóa;
    chìa khóa | đếm
-----------+-------
 dòng |   883
 Truy vấn |   207
 pos |   203
 nút |   202
 Không gian |   197
 trạng thái |   195
 công khai |   194
 Tiêu đề |   190
 org |   189
...................

F.17.6. Khả năng tương thích#

Kể từ Postgresql 9.0,토토 꽁 머니Sử dụng biểu diễn nội bộ khác với các phiên bản trước. Điều này không có trở ngại cho việc nâng cấp/khôi phục từ bỏ vì biểu diễn văn bản (được sử dụng trong bãi rác) không thay đổi.

Trong trường hợp nâng cấp nhị phân, khả năng tương thích tăng được duy trì bằng cách có mã mới nhận ra dữ liệu định dạng cũ. Điều này sẽ đòi hỏi một hình phạt hiệu suất nhỏ khi xử lý dữ liệu chưa được sửa đổi bởi mã mới. Có thể buộc nâng cấp tất cả các giá trị trong cột bảng bằng cách thực hiệnCập nhậtCâu như sau:

45340_45393

Một cách khác để làm điều đó là:

45466_45542

TheBảng thay đổiPhương pháp yêu cầuAccess ExclusiveKhóa trên bảng, nhưng không dẫn đến việc làm cho bảng với các phiên bản hàng cũ.

F.17.7. Biến đổi#

tiện ích mở rộng bổ sung có sẵn để thực hiện các biến đổi cho토토 꽁 머니Loại cho các ngôn ngữ PL/Perl và PL/Python. Các tiện ích mở rộng cho PL/perl được gọi là토토 꽁 머니_plperl토토 꽁 머니_plperlu, cho PL/Perl đáng tin cậy và không tin cậy. Nếu bạn cài đặt các biến đổi này và chỉ định chúng khi tạo hàm,토토 꽁 머니Giá trị được ánh xạ tới băm Perl. Phần mở rộng cho PL/Python được gọi là토토 꽁 머니_plpython3u. Nếu bạn sử dụng nó,토토 꽁 머니Giá trị được ánh xạ tới từ điển Python.

THẬN TRỌNG

Được khuyến nghị mạnh mẽ rằng các tiện ích mở rộng biến đổi được cài đặt trong cùng lược đồ như토토 꽁 머니. Nếu không

F.17.8. Tác giả#

Oleg Bartunov, Moscow, Đại học Moscow, Nga

Teodor Sigaev, Moscow, Delta-Soft Ltd., Nga

Cải tiến bổ sung của Andrew Gierth, Vương quốc Anh

Gửi hiệu chỉnh

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 phù hợ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.