2016-12-03 2 views
0

У меня есть 2 таблицы, пожалуйста, проверьте изображения, прикрепленныеКак обновить столбец с ограничениями внешнего ключа в DB2?

PK: PK

FK: FK

p_id в Рк таблице первичный ключ и p_id в FK таблице является внешним ключом.

Мне нужно добавить 10 для всех записей в p_id колонке как PK и FK таблицы (это означает, что они должны соответствовать всегда)

Я знаю, что в 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

вы можете изменить ключ, чтобы заставить, как это, только если вы обновляете DonT создать ключ двойного значения (например, ключ + 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

Не могли бы вы объяснить это с помощью запроса? im new to db2 – Swat

Смежные вопросы