[英]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.