如何为SQL中的列组合赋予唯一约束,而不考虑Order

时间:2015-10-09 14:39:57

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我有两张桌子。 First One是包含Data的产品表,第二个包含Parent Child关系。

ProductTable
===================
PkId Manufacturer Model ...
1      A            A1
2      B            B1
3      C            C1

JoinIng Table for Parent Child relationship (accessories)

Accessories
=============
PkAccessoryId  Fk_ProductId(Child)  ProductId(Parent)
---------------------------------------------------------
1                      2                1              (A has B As accessory)
2                      1                2              (B has A as accessory)  --(//this record is an invalid entry due to the missing constraint and need to prevent this.)

如何为(Fk_ProductId,ProductId)添加唯一约束,以便无法添加Fk_Productid和ProductId的组合。

Example: Invalid case as this will make a loop of accessory
         1,  2
         2   1 

我已经添加了一个约束,如下所示。

ALTER TABLE Tx_ProductAccessories
  ADD CONSTRAINT UNI_CONS_Fk_ProductId_ProductId UNIQUE(Fk_ProductId, ProductId);

此外,我打算防止任何非法进入,它会导致循环。 如下。

 A-A   (Read product A has product A as accessory )
 A-B-A
 A-B-C-A
 A-B-C-B
 ...
  

任何产品(P1)都可以是任何其他产品(P2)的附件   辅助产品P1不是母产品,祖母产品   或其父母行中的任何地方,这将导致循环循环。

1 个答案:

答案 0 :(得分:4)

您可以使用计算列来执行此操作:

alter table Tx_ProductAccessories
    add least_productId as (case when Fk_ProductId < ProductId
                                 then Fk_ProductId else ProductId end);

alter table Tx_ProductAccessories
    add greatest_productId as (case when Fk_ProductId < ProductId
                                    then ProductId else Fk_ProductId end);

alter table Tx_ProductAccessories
    add constraint uni_fkProductId_ProductId unique(least_productId, greatest_ProductId);