2017-06-15 78 views
0

表的外键我有mysql中的两个表看起来像:MySQL的:与几乎类似领域

Product: 

ID(PK)  Details 
AB23CD  etc 
EF45GH  etc 
AB34CD  etc 
more rows... 

Client: 

P1  P2  Client ClientCallsThis 
AB  CD  X  X1 
EF  GH  Y  Y1 
EF  GH  X  X2 
more rows... 

P1和P2指的是前两个和最后两个字符从产品ID列。


我会想这两个表连接在一起。我想到了一个办法是引入2分列在产品表,并通过中间表(Product-Client)加入他们的行列:

Product: 

ID(PK) Details P1(FK) P2(FK) 
AB23CD etc  AB  CD 
EF45GH etc  EF  GH 
AB34CD etc  AB  CD 
more rows... 

Client: 

P1(FK) P2(FK) Client ClientCallsThis 
AB  CD  X  X1 
EF  GH  Y  Y1 
EF  GH  X  X2 
more rows... 

Product-Client: 

P1(PK) P2(PK) 
AB  CD 
EF  GH 
more rows... 

但是这样做,是很浪费,并增加了复杂性(增加了出错的可能性)因为P1和P2可以很容易地从ID列导出。我能做些什么来避免这个问题?也许某种方式将Product中的ID加入Product-Client中的P1和P2中?

提供的任何帮助非常感谢!

+0

对于外键工作,必须在引用字段中具有**完全相同的值。 – Shadow

回答

1

要使外键正常工作,必须在引用的字段中具有完全相同的值。所以,如果你打算有外键,那么你必须有额外的字段。故事结局。

为了保持数据的完整性更容易,你可以使用

1)触发,以保持产品表

2)从MySQL v5.7.6,你可以定义P1P2P1P2在产品表中为stored generated columns(强调存储,否则您不能在FK关系中使用它们),该值将基于产品ID。

然而,InnoDB的有FKs using stored generated columns具体的限制:

上存储生成列外键约束不能 UPDATE梯级利用,ON DELETE SET NULL,ON UPDATE SET NULL,ON DELETE SET DEFAULT或ON UPDATE SET DEFAULT。

•外键约束无法引用虚拟生成的 列。

•在5.7.16之前,外键约束无法引用在虚拟生成列上定义的辅助索引 。

•在MySQL 5.7.13及更早版本中,InnoDB不允许在索引虚拟生成列的基本列 上通过级联参考操作定义 外键约束。这个限制是在MySQL 5.7.14中解除的 。

•在MySQL 5.7.13及更早版本中,InnoDB不允许在虚拟外键列上定义 级联参照动作,其中 明确包含在虚拟索引中。在MySQL 5.7.14中解除了这个限制 。

+0

这正是我正在寻找的!非常感谢! –

1

如果ABCD有独立的意义,不要将它们存储为单个字符串AB23CD,但作为单独字符串P1='AB'P3='23'P2='CD'

产品表然后将有一个复合主键,可以用作其他表中的外键。

 
Product. PK = P1 + P2. 

P1 P2 ProductName 
AB CD etc  
EF GH etc  


ProductVariant. PK = P1 + P2 + P3. FK on Product(P1,P2). 

P1 P2 P3 Details 
AB CD 23 etc  
EF GH 45 etc  
AB CD 34 etc  


Client. PK = ClientID. 

ClientID ClientName 
X   A 
Y   B 
X   C 


Product_Client. PK = P1 + P2 + ClientID. FK1 on Product(P1,P2). FK2 on Client(ClientID). 

P1 P2 ClientID ClientCallsThis 
AB CD X   X1 
EF GH Y   Y1 
EF GH X   X2