限制以避免外键组合

时间:2014-09-03 14:46:36

标签: postgresql constraints postgresql-9.3

我在这里遇到一个问题,我无法在我的研究中找到合适的解决方案,也许是因为我找不到确切的条款来搜索它,所以如果这是重复,我将删除它。

我的问题是我想知道是否可以避免两个字段之间的数据组合。我将展示我想要避免的结构和数据类型。它会更容易理解。

Table_A                         Table_B
------------------------        -------------------------------               
id integer (PK)                 id integer (PK) 
description varchar(50)         title varchar(50)
                                id1_fromA  (FK A->id)
                                id2_fromA  (FK A->id)

我尝试验证表Table_B上的以下数据(组合在id1_fromA和id2_fromA之间)

id   title          id1_fromA  id2_fromA  
1    Some Title         1         2 --It will be permmited
2    Some other         1         2 --It is a duplicate NOT ALLOWED
3    One more           1         1 --It is equals NOT ALLOWED
4    Another            2         1 --It is same as registry id 1 so NOT ALLOWED
5    Sample data        3         2 --It is ok

通过以上数据,我可以轻松解决注册表ID=2

的问题
ALTER TABLE table_B ADD CONSTRAINT UK_TO_A_FKS UNIQUE (id1_fromA, id2_fromA);

注册表ID=3的问题与

ALTER TABLE table_B ADD CONSTRAINT CHK_TO_A_FKS CHECK (id1_fromA != id2_fromA);

我的问题在于注册管理机构ID=4我希望避免将此类重复复制为1,2 = 2,1。是否可以使用CONSTRAINTINDEXUNIQUE来执行此操作,或者我需要创建触发器或程序来执行此操作?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您无法使用唯一约束来执行此操作,但您可以使用唯一的索引执行此操作。

create unique index UK_TO_A_FKS 
   on table_b (least(id1_froma, id2_froma), greatest(id1_froma, id2_froma));