Misalkan Anda memiliki dua tabel ini:
create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));
Tabel referensi referensi tabel referensi:
=> \d referencer
Table "public.referencer"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
Foreign-key constraints:
"referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)
Kemudian Anda memasukkan nilai di keduanya:
insert into referenced values (1);
insert into referencer values (1);
select *
from
referenced rd
inner join
referencer rr on rd.id = rr.a
;
id | a
----+---
1 | 1
Sekarang Anda ingin mengubah referensi ke on update cascade
:
alter table referencer
drop constraint referencer_a_fkey,
add foreign key (a) references referenced (id) on update cascade;
Dan perbarui:
update referenced set id = 2;
select *
from
referenced rd
inner join
referencer rr on rd.id = rr.a
;
id | a
----+---
2 | 2
Sekarang Anda akan memiliki masalah lain di kunci utama tabel yang direferensikan jika id yang diperbarui sudah ada. Tapi itu akan membuat pertanyaan lain.
PERBARUI
Ini berbahaya jadi buat cadangan db terlebih dahulu. Itu harus dilakukan sebagai pengguna super:
update pg_constraint
set confupdtype = 'c'
where conname in (
select
c.conname
from
pg_constraint c
inner join
pg_class referenced on referenced.oid = c.confrelid
where
referenced.relname = 'referenced'
and
c.contype = 'f'
);
Ini akan mengubah semua batasan kunci asing pada tabel yang direferensikan menjadi on update cascade