PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL - ID der Tabellenzeile richtig ändern

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