sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - ID van tabelrij correct wijzigen

Stel dat u deze twee tabellen heeft:

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

Tabelverwijzingsreferenties tabel waarnaar wordt verwezen:

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

Vervolgens voeg je een waarde in beide in:

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 wil je de verwijzing veranderen naar on update cascade :

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

En update het:

update referenced set id = 2;

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

Nu heb je een ander probleem in de primaire sleutel van de tabel waarnaar wordt verwezen als de bijgewerkte id al bestaat. Maar dat zou een andere vraag zijn.

UPDATE

Dit is gevaarlijk, dus maak eerst een back-up van de db. Het moet worden gedaan als superuser:

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

Het zal alle externe-sleutelbeperkingen in de tabel waarnaar wordt verwezen veranderen in on update cascade



  1. PostgreSQL in Helm:initdbScripts-parameter

  2. Datumbereiken samenvoegen

  3. Kan een Android-app rechtstreeks verbinding maken met een online mysql-database?

  4. Het gebruik van de PostgreSQL-reeks in de slaapstand heeft geen invloed op de reekstabel