sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:cambie correctamente la ID de la fila de la tabla

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