Załóżmy, że masz te dwie tabele:
create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));
Odnośnik do tabeli odnosi się do tabeli:
=> \d referencer
Table "public.referencer"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
Foreign-key constraints:
"referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)
Następnie wstawiasz wartość w obu:
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
Teraz chcesz zmienić odniesienie na on update cascade
:
alter table referencer
drop constraint referencer_a_fkey,
add foreign key (a) references referenced (id) on update cascade;
I zaktualizuj go:
update referenced set id = 2;
select *
from
referenced rd
inner join
referencer rr on rd.id = rr.a
;
id | a
----+---
2 | 2
Teraz będziesz mieć inny problem w kluczu podstawowym tabeli, do której odwołuje się odwołanie, jeśli zaktualizowany identyfikator już istnieje. Ale to spowodowałoby kolejne pytanie.
AKTUALIZACJA
Jest to niebezpieczne, więc najpierw wykonaj kopię zapasową bazy danych. Należy to zrobić jako superużytkownik:
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'
);
Zmieni wszystkie ograniczenia klucza obcego w tabeli odniesienia na on update cascade