Да предположим, че имате тези две таблици:
create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));
Таблицата препраща към таблицата, към която се препраща:
=> \d referencer
Table "public.referencer"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
Foreign-key constraints:
"referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)
След това вмъквате стойност и в двете:
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
Сега искате да промените препратката към on update cascade
:
alter table referencer
drop constraint referencer_a_fkey,
add foreign key (a) references referenced (id) on update cascade;
И го актуализирайте:
update referenced set id = 2;
select *
from
referenced rd
inner join
referencer rr on rd.id = rr.a
;
id | a
----+---
2 | 2
Сега ще имате друг проблем в първичния ключ на реферираната таблица, ако актуализираният идентификатор вече съществува. Но това би породило друг въпрос.
АКТУАЛИЗАЦИЯ
Това е опасно, така че първо архивирайте db. Трябва да се направи като суперпотребител:
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'
);
Той ще промени всички ограничения на външния ключ на референтната таблица на on update cascade