我在这里遇到一个问题,我无法在我的研究中找到合适的解决方案,也许是因为我找不到确切的条款来搜索它,所以如果这是重复,我将删除它。
我的问题是我想知道是否可以避免两个字段之间的数据组合。我将展示我想要避免的结构和数据类型。它会更容易理解。
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
。是否可以使用CONSTRAINT
或INDEX
或UNIQUE
来执行此操作,或者我需要创建触发器或程序来执行此操作?
提前致谢。
答案 0 :(得分:2)
您无法使用唯一约束来执行此操作,但您可以使用唯一的索引执行此操作。
create unique index UK_TO_A_FKS
on table_b (least(id1_froma, id2_froma), greatest(id1_froma, id2_froma));