sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL - skift korrekt ID for tabelrækken

Antag, at du har disse to tabeller:

create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));

Tabel referencer referencer tabel refereret:

=> \d referencer
  Table "public.referencer"
 Column |  Type   | Modifiers 
--------+---------+-----------
 a      | integer | 
Foreign-key constraints:
    "referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)

Så indsætter du en værdi i begge:

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

Nu vil du ændre referencen til on update cascade :

alter table referencer
    drop constraint referencer_a_fkey,
    add foreign key (a) references referenced (id) on update cascade;

Og opdater det:

update referenced set id = 2;

select *
from
    referenced rd
    inner join
    referencer rr on rd.id = rr.a
;
 id | a 
----+---
  2 | 2

Nu vil du have et andet problem i den refererede tabel primærnøgle, hvis det opdaterede id allerede eksisterer. Men det ville give et andet spørgsmål.

OPDATERING

Dette er farligt, så tag backup af db først. Det skal gøres som superbruger:

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'
);

Det vil ændre alle begrænsningerne for fremmednøgle på den refererede tabel til on update cascade



  1. nodejs mysql multiple hvor forespørgslen er

  2. Sådan beregnes løbende sum for hver gruppe i MySQL

  3. mysql AS-klausul

  4. SQL Self Join