在[1、2、3,...]列中,使[(1、2),(1、3),(1、4),...]之间唯一

时间:2018-08-05 07:48:53

标签: sql mysqli unique

基本上是标题。

什么会被认为更好:

    (li,n)在所有(1,k)列之间的n-1个UNIQUE对
  1. 一些触发器与上面的触发器基本相同,但又要重申一下-如何在没有大量代码的情况下执行该触发器。
  2. 其他我不知道的地方-请指出正确的方向。

关于以此为例:

说有一个具有许多属性的产品。我们希望属性中的所有列对于Product来说都是唯一的,例如:

Product
ID    Name
1     Something
2     Other

Attribute
ID    ProductID  Name    Code    Alias1    Alias2
1     1          One     O       1         |
2     1          Two     T       2         ||
3     1          Three   T       3         |||
4     2          Two     T       2         ||

因此ID为4的属性会通过,因为它在ProductID = 2的所有列上都是唯一的。属性ID = 3将失败,因为它重复了ID = 2已经使用的Code = T。

2 个答案:

答案 0 :(得分:1)

您似乎希望使用productid对每对列分别设置唯一的约束:

create unique index unq_product_productid_name on product(productid, name);
create unique index unq_product_productid_code on product(productid, code);
create unique index unq_product_productid_alias1 on product(productid, alias1);
create unique index unq_product_productid_alias1 on product(productid, alias2);

可以使用触发器来实现。但是,除非每个列对都有一个索引,否则确定唯一性将非常昂贵。因此,为了提高性能,您需要相同的索引。

拥有这些索引会产生开销-尤其是在数据修改操作方面。如果您很少这样做,那么没有索引的触发器就可以了。

不过,总而言之,我会在每对上使用单独的唯一索引,因为这是数据完整性检查的意图。从清晰表达您意图的代码开始。以后,如果性能存在问题,您可以尝试其他解决方案。

答案 1 :(得分:0)

您可以在两列上添加UNIQUE索引:

CREATE INDEX UQ_tab ON tab_name(ProductId, Code);
-- before you do that you need to clean initial data