从JSON对象创建UNIQUE约束


8

让我们举个例子表人,只有两个字段: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 }

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

我该如何处理?


6
JSON用于无模式的非结构化数据。如果需要约束,则应正确规范化数据。
a_horse_with_no_name

5
“规范化,规范化,规范化!” (VI dezso)
dezso

Answers:


17

首先,我同意@a_horse_with_no_name和@dezso的评论:您应该规范化数据。JSON 适用于此。

但是,如果由于某种原因我无法理解,这确实可以使它成为一个优势,则有可能:

创建一个基于UNIQUE INDEX表达式

CREATE UNIQUE INDEX people_data_pos_idx ON peoples( (data->>'pos') ) ;

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

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

您得到此作为回应:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.