此模組實作 hstore
資料類型,用於在單個 PostgreSQL 值中儲存鍵/值配對的集合。這在各種情況下都很有用,例如具有很少檢查的許多屬性的列,或半結構化資料。鍵和值只是文字字串。
此模組被認為是「受信任的」,也就是說,非超級使用者只要對目前的資料庫具有 CREATE
權限,就可以安裝它。
hstore
外部表示法 #hstore
的文字表示法(用於輸入和輸出)包括零或多個以逗號分隔的 鍵
=>
值
配對。 一些範例
k => v foo => bar, baz => whatever "1-a" => "anything at all"
配對的順序並不重要(並且可能不會在輸出中重現)。 配對之間或 =>
符號周圍的空白會被忽略。 將包含空白、逗號、=
或 >
的鍵和值加上雙引號。 若要在鍵或值中包含雙引號或反斜線,請使用反斜線跳脫字元。
hstore
中的每個鍵都是唯一的。 如果宣告具有重複鍵的 hstore
,則只會將一個鍵儲存在 hstore
中,並且無法保證會保留哪個鍵
SELECT 'a=>1,a=>2'::hstore; hstore ---------- "a"=>"1"
值(但不是鍵)可以是 SQL NULL
。 例如
key => NULL
NULL
關鍵字不區分大小寫。 將 NULL
加上雙引號,將其視為普通字串「NULL」。
請記住,hstore
文字格式在用於輸入時,會在任何需要的引號或跳脫字元之前套用。 如果您透過參數傳遞 hstore
字面值,則不需要額外處理。 但如果您將其作為加上引號的文字常數傳遞,則任何單引號字元和(取決於 standard_conforming_strings
組態參數的設定)反斜線字元都需要正確跳脫字元。 有關字串常數處理的詳細資訊,請參閱第 4.1.2.1 節。
在輸出時,雙引號總是會包圍鍵和值,即使嚴格來說沒有必要。
hstore
運算子和函數 #hstore
模組提供的運算子顯示在表 F.6中,函數顯示在表 F.7中。
表 F.6. hstore
運算子
運算子 描述 範例 |
---|
傳回與給定鍵關聯的值,如果不存在則傳回
|
傳回與給定鍵關聯的值,如果不存在則傳回
|
串連兩個
|
|
|
|
左運算元是否包含右運算元?
|
左運算元是否包含在右運算元中?
|
從左運算元刪除鍵。
|
從左運算元刪除鍵。
|
從左邊運算元中刪除與右邊運算元匹配的鍵值對。
|
使用
|
將
|
將
|
表 F.7. hstore
函數
除了這些運算子和函數外,hstore
類型的值可以使用下標,使其像關聯陣列一樣運作。只能指定一個 text
類型的下標;它被解釋為一個鍵,並且獲取或儲存相應的值。例如,
CREATE TABLE mytable (h hstore); INSERT INTO mytable VALUES ('a=>b, c=>d'); SELECT h['a'] FROM mytable; h --- b (1 row) UPDATE mytable SET h['c'] = 'new'; SELECT h FROM mytable; h ---------------------- "a"=>"b", "c"=>"new" (1 row)
如果下標是 NULL
或者該鍵不存在於 hstore
中,則下標式的獲取會返回 NULL
。(因此,下標式的獲取與 ->
運算子沒有太大區別。)如果下標是 NULL
,則下標式的更新會失敗;否則,它會替換該鍵的值,如果該鍵尚未存在,則向 hstore
新增一個條目。
hstore
支援 @>
、?
、?&
和 ?|
運算子的 GiST 和 GIN 索引。例如
CREATE INDEX hidx ON testhstore USING GIST (h); CREATE INDEX hidx ON testhstore USING GIN (h);
gist_hstore_ops
GiST 運算子類別將一組鍵/值對近似為點陣圖簽章。它的可選整數參數 siglen
決定簽章長度(以位元組為單位)。預設長度為 16 個位元組。簽章長度的有效值介於 1 到 2024 個位元組之間。較長的簽章會帶來更精確的搜尋(掃描較小部分的索引和較少的堆積頁面),但代價是索引更大。
建立具有 32 個位元組簽章長度的索引範例
CREATE INDEX hidx ON testhstore USING GIST (h gist_hstore_ops(siglen=32));
hstore
也支援 btree
或 hash
索引,用於 =
運算子。這允許將 hstore
欄位宣告為 UNIQUE
,或在 GROUP BY
、ORDER BY
或 DISTINCT
表達式中使用。 hstore
值的排序順序不是特別有用,但這些索引可能對等效查詢有用。建立 =
比較的索引如下
CREATE INDEX hidx ON testhstore USING BTREE (h); CREATE INDEX hidx ON testhstore USING HASH (h);
新增一個鍵,或使用新值更新現有鍵
UPDATE tab SET h['c'] = '3';
另一種執行相同操作的方法是
UPDATE tab SET h = h || hstore('c', '3');
如果要在一個操作中新增或更改多個鍵,則串聯方法比下標更有效
UPDATE tab SET h = h || hstore(array['q', 'w'], array['11', '12']);
刪除一個鍵
UPDATE tab SET h = delete(h, 'k1');
將 record
轉換為 hstore
CREATE TABLE test (col1 integer, col2 text, col3 text); INSERT INTO test VALUES (123, 'foo', 'bar'); SELECT hstore(t) FROM test AS t; hstore --------------------------------------------- "col1"=>"123", "col2"=>"foo", "col3"=>"bar" (1 row)
將 hstore
轉換為預定義的 record
類型
CREATE TABLE test (col1 integer, col2 text, col3 text); SELECT * FROM populate_record(null::test, '"col1"=>"456", "col2"=>"zzz"'); col1 | col2 | col3 ------+------+------ 456 | zzz | (1 row)
使用 hstore
中的值修改現有的 record
CREATE TABLE test (col1 integer, col2 text, col3 text); INSERT INTO test VALUES (123, 'foo', 'bar'); SELECT (r).* FROM (SELECT t #= '"col3"=>"baz"' AS r FROM test t) s; col1 | col2 | col3 ------+------+------ 123 | foo | baz (1 row)
由於其內在的自由性,hstore
類型可能包含大量不同的鍵。檢查有效鍵是應用程式的任務。以下範例示範了幾種用於檢查鍵和取得統計資訊的技術。
簡單範例
SELECT * FROM each('aaa=>bq, b=>NULL, ""=>1');
使用表格
CREATE TABLE stat AS SELECT (each(h)).key, (each(h)).value FROM testhstore;
線上統計資訊
SELECT key, count(*) FROM (SELECT (each(h)).key FROM testhstore) AS stat GROUP BY key ORDER BY count DESC, key; key | count -----------+------- line | 883 query | 207 pos | 203 node | 202 space | 197 status | 195 public | 194 title | 190 org | 189 ...................
從 PostgreSQL 9.0 開始,hstore
使用與先前版本不同的內部表示。由於文字表示(在傾印中使用)未更改,因此這對於傾印/還原升級沒有障礙。
在二進位升級的情況下,透過讓新程式碼識別舊格式資料來維持向上相容性。這會在處理尚未被新程式碼修改的資料時,產生輕微的效能損失。 可以透過執行 UPDATE
陳述式,強制升級資料表欄位中的所有值,如下所示
UPDATE tablename SET hstorecol = hstorecol || '';
另一種方法是
ALTER TABLE tablename ALTER hstorecol TYPE hstore USING hstorecol || '';
ALTER TABLE
方法需要資料表上的 ACCESS EXCLUSIVE
鎖定,但不會導致資料表因舊列版本而膨脹。
可以使用其他擴充功能,為 PL/Perl 和 PL/Python 語言的 hstore
類型實作轉換。PL/Perl 的擴充功能稱為 hstore_plperl
和 hstore_plperlu
,分別用於受信任和不受信任的 PL/Perl。如果您安裝這些轉換並在建立函數時指定它們,則 hstore
值會對應到 Perl 雜湊。PL/Python 的擴充功能稱為 hstore_plpython3u
。如果您使用它,則 hstore
值會對應到 Python 字典。
強烈建議將轉換擴充功能安裝在與 hstore
相同的結構描述中。否則,如果轉換擴充功能的結構描述包含敵意使用者定義的物件,則會存在安裝時的安全風險。
Oleg Bartunov <oleg@sai.msu.su>
, Moscow, Moscow University, Russia
Teodor Sigaev <teodor@sigaev.ru>
, Moscow, Delta-Soft Ltd., Russia
Andrew Gierth 的其他增強功能 <andrew@tao11.riddles.org.uk>
, United Kingdom
如果您在文件中發現任何不正確、與特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表單回報文件問題。