2011-04-27 83 views
0

我有三張桌子。 Tab_1,Tab_2和Tab_3。這裏Tab_2和Tab_3取決於Tab_1。 Tab_1的方法PK_t1在其餘表中是FK(外鍵)。是否可以這樣更新?

現在我知道我必須更新PK_t1(主鍵)列。如果我更新主鍵列,那麼子表(Tabl_2和Tab_3)的FK列也應該更新。

--------------------------------------------- 
Example 

Tab_1 
ID(PK)| Cal2 | 
---------------| 
101 | abc | 
102 | acw | 
103 | bhj | 


Tab_2 
---------------- 
Address| Cal2(FK_ID) 
---------------- 
ljjkkl | 103 
ghhj | 101 
dfgjdl | 101 

Tab_3 
---------------- 
Cal1 | ID(FK_ID) 
---------------- 
n233b | 101 
g55hhj | 103 
d867hh | 102 

現在如果我婉更新tablee tab_1中作爲

Tab_1 
ID(PK)| Cal2 | 
---------------| 
951 | abc | 
952 | acw | 
953 | bhj | 

請問這個(更新用)引起的子表也。

可能嗎?或者我應該採取什麼行動來實現這一點。

在此先感謝...!

+1

你不應該更新表的主鍵。 – 2011-04-27 06:02:59

+0

更新主鍵不是一個好主意,我沒有做到。在創建依賴表時傳遞UPDATE CASCADE可能會有所幫助。 – vpit3833 2011-04-27 06:04:32

回答

0

這其中的原因級聯更新外鍵關係之一。這樣,你就可以更新Table1中的PK,並且它會自動傳播到它的子表。該約束將類似於:

Alter Table Table2 
    Add Foreign Key (FK_ID) 
     References Table1(Id) 
     On Update Cascade 

如果不啓用級聯更新,你有兩個選擇:

  1. 禁用所有外鍵約束,更新表1的PK,更新子表,然後重新創建外鍵約束。
  2. 使用所需的ID在Table1中添加一個新值並在子表上運行更新。例如,如果你想改變的PK值101到951:

    Begin Transaction 

    Insert Table1(Id, Cal2) 
    Values(951, 'Foo') 

    Update Table2 
    Set FK_ID = 951 
    Where FK_ID = 101 

    Update Table3 
    Set FK_ID = 951 
    Where FK_ID = 101 

    ... 

    Delete Table1 Where Id = 101 

    Commit Transaction

這種第二種方法的缺點是,沒有一個新的ID值,可以與現有的PK值衝突。

相關問題