2016-12-03 45 views
0

我有2个表,请检查连接我们如何更新DB2中具有外键约束的列?

PK图片:PK

FK:FK

的p_id在PK表的主键 和P_ID在FK表的外键。

我需要添加10至两PK和FK表的p_id列中的所有记录(这意味着它们总是匹配)

我知道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 ..有人可以请帮忙吗?

我如何得到这个工作?

在此先感谢 斯瓦特

回答

2
--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; 
+0

谢谢,这个作品 – Swat

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 
) 
+0

嗨 我不能删除外键! 有什么办法可以级联或触发它吗?就像我在SQL – Swat

+0

中保存你在fk表中的行一样,删除你的fk表中的行,更新你的表pk,更新你的保存,将你的保存插入你的fk表 – Esperento57

+0

你可以用查询解释吗?即时消息新的db2 – Swat