从 JSON 对象创建 UNIQUE 约束

Che*_*o47 11 postgresql json unique-constraint

让我们以表 peoples 为例,它只有 2 个字段:id 和 data(json)。

SELECT data FROM peoples ;
{"name": "Adam","pos":"DBA","age":22 }
{"name": "Alice","pos":"Security","age":33 }
{"name": "Bob","pos":"Manager","age":42 }
Run Code Online (Sandbox Code Playgroud)

我想为“pos”字段创建约束,它必须是唯一的。我在互联网上搜索了 JSON 约束,但没有结果。

我该如何处理这个问题?

joa*_*olo 25

首先也是最重要的:我同意@a_horse_with_no_name 和@dezso 的评论:你应该规范化你的数据。JSON不是为了那个。

但是,如果我无法理解的某种原因真的使这成为一个优势,则有可能:

创建基于表达式UNIQUE INDEX

CREATE UNIQUE INDEX people_data_pos_idx ON peoples( (data->>'pos') ) ;
Run Code Online (Sandbox Code Playgroud)

如果此时您尝试将以下数据插入到您的表中(使用已经存在的 ->>pos):

INSERT INTO peoples(data)
VALUES
    ('{"name": "Eve", "pos":"DBA", "age":34}') ;
Run Code Online (Sandbox Code Playgroud)

你得到这个作为回应:

ERROR: duplicate key value violates unique constraint "people_data_pos_idx"
SQL state: 23505
Detail: Key ((data ->> 'pos'::text))=(DBA) already exists.
Run Code Online (Sandbox Code Playgroud)

注意:我假设它data.pos总是一个字符串。如果要概括,可以( (data->'pos') )改用。然后您将索引一个 JSON(B) 表达式而不是文本。检查JSON 函数和运算符