我想知道是否有可能在一組物件中實作唯一性,只使用物件的一個??欄位作為決定因素,如果物件是唯一的或不使用 jsonb。
我的意思的一個例子:
我想確保如果 jsonb 型別的欄位看起來像這樣:
"[{"x":"a", "timestamp": "2016-12-26T12:09:43.901Z"}]"
然后我想有一個約束,禁止我用“x”:“a”放置另一個條目,而不管我試圖輸入的新物件上的時間戳(或與此相關的任何其他欄位)是什么
uj5u.com熱心網友回復:
這可以通過檢查約束來實作。
create table the_table
(
id int primary key,
data jsonb,
constraint check_single_xa
check (jsonb_array_length(jsonb_path_query_array(data, '$[*] ? (@.x == "a").x')) <= 1)
);
這可以防止多個陣列元素與"x": "a". 如果你想防止多個陣列元素與鍵x(不管值),你可以使用:
constraint check_single_xa
check (jsonb_array_length(jsonb_path_query_array(data, '$[*].x')) <= 1)
uj5u.com熱心網友回復:
您可以使用CHECK約束和輔助函式來執行此操作:
CREATE FUNCTION is_x_unique(arr jsonb) RETURNS boolean
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT
RETURN NOT EXISTS(SELECT * FROM jsonb_array_elements(arr) GROUP BY value->'x' HAVING COUNT(*) > 1);
(在線小提琴)
ALTER TABLE example ADD CONSTRAINT unique_x_in_data CHECK is_x_unique(data);
uj5u.com熱心網友回復:
這樣做的獨特方法是為您的列使用 JSON 模式的 JSON 型別資料型別和 "uniqueItems": true 。
不幸的是,PostgreSQL 不接受這樣的語法來強制執行檢查。您必須在 PG 集群之外進行...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/535309.html
標籤:postgresql
