[英]MySQL: Foreign keys for tables with almost-similar fields
我在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”列中的前两个字符和后两个字符。
我想将这两张桌子放在一起 。 我想到的一种方法是在Product表中再引入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...
但是,这样做很浪费,并且增加了复杂性(增加了出错的可能性),因为可以轻松地从ID列导出P1和P2。 有什么我可以避免的问题吗? 也许以某种方式将Product
的ID加入Product-Client
P1和P2?
提供的任何帮助将不胜感激!
为了使外键起作用,您在引用的字段中必须具有完全相同的值。 因此,如果您打算使用外键,则必须具有其他字段。 故事结局。
为了使维护数据完整性更加容易,您可以使用
1)触发以维持产品表中的P1
和P2
值
要么
2)在MySQL v5.7.6中,您可以将产品表中的P1
和P2
定义为存储的生成列 (强调存储,否则不能以FK关系使用它们),该值将基于产品ID。
但是,innodb对使用存储的生成的列的FK具有特定的限制:
存储的生成列上的外键约束不能使用ON UPDATE CASCADE,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中取消了此限制。
如果AB
和CD
具有单独的含义,请不要将它们存储为单个字符串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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.