我们有一个Postgres(9.6)表格my_table
,其中包含email_address jsonb[] NOT NULL
行:
DROP TABLE my_table;
CREATE TABLE my_table (email_address jsonb NOT NULL);
我们希望将一组电子邮件地址存储为JSONB(为了这个例子,我只保留address
密钥):
INSERT INTO my_table (email_address)
VALUES (ARRAY[ $${"address": "A"}$$::jsonb,
$${"address": "B"}$$::jsonb,
$${"address": "C"}$$::jsonb ]);
INSERT INTO my_table (email_address)
VALUES (ARRAY[ $${"address": "D"}$$::jsonb ]);
我们希望确保添加到数组中的每个元素都有一组唯一的address
。
-- ["A", "B"] <@ ["A", "B", "C"], SHOULD FAIL
INSERT INTO my_table (email_address)
VALUES (ARRAY[ $${"address": "A"}$$::jsonb, $${"address": "B"}$$::jsonb ]
-- ["A", "D"] IS UNIQUE SET, SHOULD SUCCEED
INSERT INTO my_table (email_address)
VALUES (ARRAY[ $${"address": "A"}$$::jsonb, $${"address": "D"}$$::jsonb ];
我们正在考虑使用函数的排除约束吗?我们目前正在尝试&#34; map&#34;将jsonb[]
改为text[]
([{address: "A"}, {address: "B"}]
转换为["A", "B"]
)以执行简单的@>
操作,但我们很难获得任何令人信服的结果。
我们的问题是:这样的约束是否可能(如果是的话,对代码的任何帮助都会受到高度赞赏),如果不是,那么在不创建另一个表的情况下实现这样一个系统的最佳方法是什么?