Suponga que tiene estas dos tablas:
create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));
El referenciador de tabla hace referencia a la tabla a la que se hace referencia:
=> \d referencer
Table "public.referencer"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
Foreign-key constraints:
"referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)
Luego inserta un valor en ambos:
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
Ahora desea cambiar la referencia a on update cascade
:
alter table referencer
drop constraint referencer_a_fkey,
add foreign key (a) references referenced (id) on update cascade;
Y actualizarlo:
update referenced set id = 2;
select *
from
referenced rd
inner join
referencer rr on rd.id = rr.a
;
id | a
----+---
2 | 2
Ahora tendrá otro problema en la clave principal de la tabla a la que se hace referencia si la identificación actualizada ya existe. Pero eso sería otra pregunta.
ACTUALIZAR
Esto es peligroso, así que haga una copia de seguridad de la base de datos primero. Debe hacerse como superusuario:
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'
);
Cambiará todas las restricciones de clave externa en la tabla a la que se hace referencia a on update cascade