Constraint
Postgresql中JSON數據中的主鍵
我有一個表
t
,有一個名為 的列json
,類型為JSON
。在 JSON 中有一個自然鍵:> SELECT json->'id' AS id FROM t LIMIT 1; id ----------------------------- " 63631ff3809de7a17398602f"
我可以創建一個
UNIQUE INDEX
onid
,因此:> 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 KEY
和UNIQUE
約束的 SQL 標准定義不允許表達式或行匹配謂詞。因此,如果 PostgreSQL 將表達式索引或部分索引列為約束,那麼它就違反了標準,並向應用程序謊報它在做什麼。了解 PostgreSQL 特性的應用可以從 Pg 自己的目錄中查找索引,其中也有 infoinformation_schema
,但不能作為列出的約束進入。