我们如何在DB2中更新具有外键约束的列?

时间:2016-12-03 19:55:52

标签: database db2 db2-400

我有2张桌子,请查看附件中的图片

PK:PK

FK:FK

Pk表中的P_Id是主键 和FK表中的P_Id是外键。

我需要为PK和FK表的P_Id列中的所有记录添加10(意味着它们需要始终匹配)

我知道在MS SQL中我们可以轻松更新级联,如下所示:

ALTER TABLE FK
ADD CONSTRAINT FK_P_Id
FOREIGN KEY (P_Id)
REFERENCES PK (P_Id) ON UPDATE CASCADE

然后更新PK的行,这将自动更新FK。

update A
set A.P_Id= A.P_Id + 10
from PK A inner join FK B
on A.P_Id = B.P_Id

但是,我不确定它在DB2中是如何工作的......有人可以帮忙吗?

我怎样才能让它发挥作用?

提前致谢 斯瓦特

3 个答案:

答案 0 :(得分:3)

--remove you foreign key
ALTER TABLE YOURLIB.FK 
drop CONSTRAINT YOURLIB.FK_P_Id;

--update FK table
update  YOURLIB.FK 
set P_Id=P_Id+10;

--update PK table (force)
update  YOURLIB.PK overriding system value 
set P_Id=P_Id+10;

--recreate foreign key
ALTER TABLE YOURLIB.FK 
ADD CONSTRAINT YOURLIB.FK_P_Id 
FOREIGN KEY (P_Id)
REFERENCES YOURLIB.PK (P_Id)
ON DELETE RESTRICT;

--If you id on PK is autoincremented, restart it (here 123456 in example but you must found max of id  in your PK table --> select max(p_id) from yourlib.pk)
ALTER TABLE YOURLIB.PK
ALTER COLUMN P_Id
RESTART with 123456;

答案 1 :(得分:0)

你可以修改一个像这样强制的键,只有你更新不创建双值键(例如你的键中已经存在你的键+ 10),否则你必须在更新之前删除主键(危险,小心如果有人正在你的桌子上工作)。好的,你必须删除外键才能做到这一点

update pk f0 overriding system value
set f0.id=f0.id+10
where exists 
(
    select * from fk f1
    where f0.id=f1.id
)

答案 2 :(得分:0)

使用

SET FOREIGN_KEY_CHECKS = 0;

更新两个表;

然后

SET FOREIGN_KEY_CHECKS = 1;