有可能像这样更新吗?

时间:2011-04-27 05:59:37

标签: mysql

我有三张桌子。 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

现在如果我想将表格Tab_1更新为

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

此(更新)是否也会导致子表。

有可能吗?或者我应该采取什么必要的行动来实现这一目标。

提前致谢...!

2 个答案:

答案 0 :(得分:0)

使用数据库引擎innodb并使用选项on update创建表格,on delete

请参阅此处foreign key constraints

答案 1 :(得分:0)

这是外键关系级联更新的原因之一。有了它,您将能够更新Table1中的PK,它将自动传播到其子表。这种约束看起来像是:

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

如果未启用Cascade Update,您有两种选择:

  1. 禁用所有外键约束,更新Table1中的PK,更新子表,然后重新创建外键约束。
  2. 使用您想要的ID向Table1中添加一个新值,并在子表上运行Update。例如,如果要将PK值101更改为951:
  3. 
        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值发生碰撞。