Foreign Key ile bağlantı kurulmuş kayıtlarda güncelleme yapmak.

Primary Key – Foreign Key ilişkisi kurulmuş olan bir yapıda,  foreign key olan alanların değerini yeni bir değerle nasıl değiştirebiliriz?

Bir örnek ile açıklamaya çalışalım; Müşteri ve ödeme  bilgilerini içeren iki tablomuz ve aralarında Müşteri id üzerinden foreign key bağlantısı olmuş olsun. Müşteri bilgileri tablosunda A firmasının ikinci bir kaydının A* şeklinde açılmış olduğunu ve bu yanlış açılan firma için ödeme bilgisi girildiğini kabul edelim. A* firmasının yanlış açılmış bir kayıt olduğunu, A* firmasına yapılan ödeme bilgilerinin A firması olarak değiştirilmesi gerektiğinde ödeme bilgilerindeki Müşteri id’sinin güncellenmesi gerekecektir.  Tek tablo için bir update yeterli iken 100’den fazla tabloda update yapılması gerektiğinde ne yapılmalıdır? İlgili tabloya foreign key’le bağlı olan tabloları ve ilişkili olan alanları bulup  alandaki değerleri güncellemek en kestirme yol olacaktır.

Şöyle ki:

drop table odeme_test;
drop table musteri_test;

create table musteri_test (
   musteri_id number primary key,
   adi varchar2(20)
);


create table odeme_test (
   musteri_id number references musteri_test(musteri_id) ,
   tutar number
);

insert into musteri_test values (1,'A FIRMASI');
insert into musteri_test values (2,'B FIRMASI');
insert into musteri_test values (3,'A* FIRMASI');

insert into odeme_test values (1,10);
insert into odeme_test values (2,-10);
insert into odeme_test values (3,20);
insert into odeme_test values (1,-20);
insert into odeme_test values (2,30);
insert into odeme_test values (3,-30);
commit;

SQL> select * from musteri_test;

MUSTERI_ID ADI
---------- --------------------
         1 A FIRMASI
         2 B FIRMASI
         3 A* FIRMASI

SQL> select * from odeme_test;

MUSTERI_ID      TUTAR
---------- ----------
         1         10
         2        -10
         3         20
         1        -20
         2         30
         3        -30

6 satırları seçildi.

Güncellemeleri yapacak sql’ler oluşturuluyor…

SQL> select
 'UPDATE '|| a.OWNER ||'.'|| c.TABLE_NAME ||
 ' SET '|| c.COLUMN_NAME ||'=&YENI'||
 ' WHERE '|| c.COLUMN_NAME ||'=&ESKI;' update_sql
 from
 all_constraints a,
 all_cons_columns c
 where
 a.constraint_type = 'R'
 and a.CONSTRAINT_NAME = c.CONSTRAINT_NAME
 and r_constraint_name in
 (
 select constraint_name
 from all_constraints
 where constraint_type in ('P')
 and table_name = 'MUSTERI_TEST'
 );

yeni değerini girin: 1
eski 3: ' SET '|| c.COLUMN_NAME ||' = &YENI'||
yeni 3: ' SET '|| c.COLUMN_NAME ||' = 1'||
eski değerini girin: 3
eski 4: ' WHERE '|| c.COLUMN_NAME ||'= &ESKI;' update_sql
yeni 4: ' WHERE '|| c.COLUMN_NAME ||'= 3;' update_sql
UPDATE_SQL
-------------------------------------------------------
UPDATE ZGUVEN.ODEME_TEST SET MUSTERI_ID=1 WHERE MUSTERI_ID=3;

SQL> UPDATE ZGUVEN.ODEME_TEST SET MUSTERI_ID=1 WHERE MUSTERI_ID=3;

2 satırları güncellendi.

SQL> select * from odeme_test;

MUSTERI_ID      TUTAR
---------- ----------
         1         10
         2        -10
         1         20
         1        -20
         2         30
         1        -30

6 satırları seçildi.

SQL>