Giả sử bạn có hai bảng sau:
create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));
Bảng tham chiếu trình tham chiếu bảng được tham chiếu:
=> \d referencer
Table "public.referencer"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
Foreign-key constraints:
"referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)
Sau đó, bạn chèn một giá trị vào cả hai:
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
Bây giờ bạn muốn thay đổi tham chiếu thành on update cascade
:
alter table referencer
drop constraint referencer_a_fkey,
add foreign key (a) references referenced (id) on update cascade;
Và cập nhật nó:
update referenced set id = 2;
select *
from
referenced rd
inner join
referencer rr on rd.id = rr.a
;
id | a
----+---
2 | 2
Bây giờ bạn sẽ gặp một vấn đề khác trong khóa chính của bảng được tham chiếu nếu id được cập nhật đã tồn tại. Nhưng điều đó sẽ tạo ra một câu hỏi khác.
CẬP NHẬT
Điều này rất nguy hiểm vì vậy hãy sao lưu db trước. Nó phải được thực hiện như superuser:
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'
);
Nó sẽ thay đổi tất cả các ràng buộc khóa ngoại trên bảng được tham chiếu thành on update cascade