我有一个如下表-
id someId someType someEmailId
-------------------------------------
1 {1} someType someEmailId
1 {2,3,4} someType2 someEmailId2
现在,我想基于someId,someType,someEmailId列的唯一组合在此表中具有唯一条目。 另外,我想确定是否有人使用带有-
之类数据的插入语句来创建新条目id someId someType someEmailId
-----------------------------------------------------
200 {2} someType2 someEmailId2
那么这也不应该被允许,因为someId列(数组类型)已经包含元素2,并且其他字段(someType和someEmailId)也与条目相同。
我在带有列(someId,someType,someEmailId)的表上保持唯一的键约束,但是不确定如何停止我提到的插入情况。 我知道我可以使用@>运算符来做到这一点。
答案 0 :(得分:0)
听起来您想要EXCLUDE constraint。
但是要使用其中一个,您将需要创建一些扩展来创建正确的运算符系列:
create extension btree_gist;
create extension intarray;
alter table sometable add constraint dfaf exclude using gist (sometype with =, someemailid with =, someid with &&);
(我不太喜欢'intarray'模块,但不知道获得此功能的更好方法)
将其放置在适当的位置,然后尝试插入指示的内容:
insert into sometable values (200, '{2}', 'someType2', 'someEmailId2');
您将获得约束违规,因为在某类型和somemailid上已经存在=且在someid上有(&&)重叠的行,因此将得到如下错误和消息:
ERROR: conflicting key value violates exclusion constraint "dfaf"
DETAIL: Key (sometype, someemailid, someid)=(someType2, someEmailId2, {2}) conflicts with existing key (sometype, someemailid, someid)=(someType2, someEmailId2, {2,3,4}).