PostgreSQL的:我想像下面这样插入数据-

时间:2019-09-11 17:11:07

标签: postgresql

我有一个如下表-


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)的表上保持唯一的键约束,但是不确定如何停止我提到的插入情况。 我知道我可以使用@>运算符来做到这一点。

1 个答案:

答案 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}).