Postgresql:我想以如下方式插入数据-

Postgresql:我想以如下方式插入数据-,postgresql,Postgresql,我有一张像下面这样的桌子- id someId someType someEmailId ------------------------------------- 1 {1} someType someEmailId 1 {2,3,4} someType2 someEmailId2 现在,我想根据someId、someType和someEmailId列的唯一组合在这个表中创建唯一的条目。 另外,我想确定是否有人

我有一张像下面这样的桌子-


id  someId  someType    someEmailId
-------------------------------------
1       {1}     someType        someEmailId
1       {2,3,4}     someType2       someEmailId2


现在,我想根据someId、someType和someEmailId列的唯一组合在这个表中创建唯一的条目。 另外,我想确定是否有人使用insert语句创建了一个新条目,该语句的数据如下-

id  someId  someType    someEmailId
-----------------------------------------------------
200     {2}   someType2     someEmailId2
那么这也是不允许的,因为someId列(数组类型)已经包含元素2,其他字段(someType和someEmailId)也与条目相同

我在带有列的表(someId、someType、someEmailId)上保留了一个唯一的键约束,但不确定如何停止我提到的插入案例。
我知道我可以用@>接线员来做。

听起来你想要一个

但若要使用一个,您需要创建一些扩展,以创建正确的操作符族:

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');
您将得到一个约束冲突,因为已经有一行在sometype和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}).

再插入一个case-``400{2,3}someType2 someEmailId2``这也不可能。我想一个唯一的约束不能给你这个检查。您可以编写一个触发器来对数组entriesThanks执行检查,以获取响应。你能详细说明一下像-400{2,3}someType2 someEmailId2 200{2}someType2 someEmailId2这样的插入尝试是如何停止的吗?不是最快的学习者。:)