2011-04-27 73 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值冲突。

相关问题