Angenommen, Sie haben diese beiden Tabellen:
create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));
Tabellenverweiser verweist auf Tabelle, auf die verwiesen wird:
=> \d referencer
Table "public.referencer"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
Foreign-key constraints:
"referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)
Dann fügen Sie einen Wert in beide ein:
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
Nun möchten Sie den Verweis auf on update cascade
ändern :
alter table referencer
drop constraint referencer_a_fkey,
add foreign key (a) references referenced (id) on update cascade;
Und aktualisieren Sie es:
update referenced set id = 2;
select *
from
referenced rd
inner join
referencer rr on rd.id = rr.a
;
id | a
----+---
2 | 2
Jetzt haben Sie ein weiteres Problem im Primärschlüssel der referenzierten Tabelle, wenn die aktualisierte ID bereits vorhanden ist. Aber das würde eine andere Frage aufwerfen.
AKTUALISIEREN
Dies ist gefährlich, sichern Sie also zuerst die Datenbank. Dies muss als Superuser erfolgen:
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'
);
Es ändert alle Fremdschlüsseleinschränkungen für die referenzierte Tabelle in on update cascade