簡體   English   中英

MySQL:具有幾乎相似字段的表的外鍵

[英]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)觸發以維持產品表中的P1P2

要么

2)在MySQL v5.7.6中,您可以將產品表中的P1P2定義為存儲的生成列 (強調存儲,否則不能以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中取消了此限制。

如果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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM