Constraint

Postgresql中JSON數據中的主鍵

  • May 2, 2014

我有一個表t,有一個名為 的列json,類型為JSON。在 JSON 中有一個自然鍵

> SELECT json->'id' AS id FROM t LIMIT 1;
            id              
-----------------------------
" 63631ff3809de7a17398602f"

我可以創建一個UNIQUE INDEXon id,因此:

> CREATE UNIQUE INDEX t_id ON t((json->>'id'));                                                                                                                       

CREATE INDEX

我想將其添加為table_constraint_using_index,但兩者都失敗PRIMARY KEY

> ALTER TABLE t ADD CONSTRAINT t_pkey PRIMARY KEY USING INDEX t_id;                                                                                   
ERROR:  index "t_id" contains expressions
LINE 1: ALTER TABLE t ADD CONSTRAINT t_pkey
                                         ^
DETAIL:  Cannot create a primary key or unique constraint using such an index.

UNIQUE

> ALTER TABLE t ADD CONSTRAINT t_unique_id UNIQUE USING INDEX t_id;
ERROR:  index "t_id" contains expressions
LINE 1: ALTER TABLE t ADD CONSTRAINT t_unique_id...
                                         ^
DETAIL:  Cannot create a primary key or unique constraint using such an index.

我應該能夠添加這樣的約束嗎?

不,您不應該添加這樣的約束。

PRIMARY KEY必須是簡單或複合索引。它可能不是部分索引或表達式索引。

索引充當約束,在功能上它們大致相同,但它不能作為PRIMARY KEY表元數據中的 出現,也不能用作外鍵約束的目標。UNIQUE約束也是如此。

這裡的問題是PRIMARY KEYUNIQUE約束的 SQL 標准定義不允許表達式或行匹配謂詞。因此,如果 PostgreSQL 將表達式索引或部分索引列為約束,那麼它就違反了標準,並向應用程序謊報它在做什麼。了解 PostgreSQL 特性的應用可以從 Pg 自己的目錄中查找索引,其中也有 info information_schema,但不能作為列出的約束進入。

引用自:https://dba.stackexchange.com/questions/64270