2013-09-05 250 views
2

我正在使用MySQL &我需要創建下列表格。從主鍵創建外鍵

1st table : having 3 attributes A,B,C 
2nd table : having 2 attributes B,D 
3rd table : having 2 attributes C,E 

現在,A是主鍵。

我需要創建第2到第3個表,使得第2個表中B的值應該已經存在於第1個表的B屬性中,&類似地,第3個表的C中的值應該已經存在於第1個表的C中。

我嘗試:

1)放了兩個,第二& 3桌,&是將它作爲第一個表的外鍵引用,&穿上級聯更新只。

2)保持對第2個&第3個表的檢查約束,儘管當屬性來自不同的表時,我無法找到適當的檢查約束語法。

PI建議更好的選擇或即興創建我想到的當前方法。

回答

3

,使得在B中第二表中的值應該是在第一表的乙屬性已經存在,在&表第3章C類似值應在第一表中的Ç已經存在。

爲了滿足第一個要求,B必須在第一個表中聲明爲唯一。爲了滿足第二個要求,C在第一個表中必須是唯一的。因此,我們將得到的結構(數據類型的選擇是任意):

Create Table FirstTable 
    (
    A varchar(50) not null Primary Key 
    , B varchar(50) Unique 
    , C varchar(50) Unique 
    ); 

Create Table SecondTable 
    (
    B varchar(50) 
    , D varchar(50) 
    ); 

Alter Table SecondTable 
    Add Constraint FK_SecondTable_FirstTable_B 
    Foreign Key (B) 
    References FirstTable (B) 
    On Update Cascade; 

Create Table ThirdTable 
    (
    C varchar(50) 
    , E varchar(50) 
    ); 

Alter Table ThirdTable 
    Add Constraint FK_ThirdTable_FirstTable_C 
    Foreign Key (C) 
    References FirstTable (C) 
    On Update Cascade; 

對於檢查約束,MySQL的的「可愛」的特點之一是,雖然它解析,並接受檢查約束在Create Table語句中,就評估而言,它完全忽略了它們。即:

CHECK子句被解析,但被所有存儲引擎忽略。

Create Table documentation

現在,即使不是這樣,在SQL語言的檢查約束機制只能在當前表中的列,因此無助於解決你的問題。

+0

MySQL解析,接受並忽略內聯FK約束,就像它與'CHECK'約束一樣;) –

+0

@ypercube - 神聖的廢話。哪個MySQL bozo認爲默默地忽略關於約束的任何事情是一個好主意?! MySQL,現代時代的訪問。無論如何,我已經調整爲Alter Table語句。 – Thomas

+0

我認爲它實際上給出警告 - 但不確定。 –

0

我不確定我完全理解這個問題。將屬性B和C分別作爲表2和表3的主鍵是不明智的。然後,您可以將它們作爲第一個表中的外鍵引用。

+0

外鍵在table1中,需要從table2和table3中引用。 – dcaswell