sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL - správně změňte ID řádku tabulky

Předpokládejme, že máte tyto dvě tabulky:

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

Odkaz na tabulku odkazuje na tabulku, na kterou se odkazuje:

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

Potom do obou vložíte hodnotu:

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

Nyní chcete změnit odkaz na on update cascade :

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

A aktualizujte jej:

update referenced set id = 2;

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

Nyní budete mít další problém v primárním klíči odkazované tabulky, pokud aktualizované ID již existuje. Ale to by vyvolalo další otázku.

AKTUALIZACE

To je nebezpečné, proto nejprve zálohujte db. Musí to být provedeno jako superuživatel:

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

Změní všechna omezení cizího klíče v odkazované tabulce na on update cascade



  1. ID posledního vložení MySql, konektor .net

  2. Architektura SQL Server AlwaysOn ( Availability Group ) a instalace krok za krokem -2

  3. SQL Developer 4.1.2

  4. Databázový model pro online průzkum. Část 1