PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL - poprawna zmiana ID wiersza tabeli

Załóżmy, że masz te dwie tabele:

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

Odnośnik do tabeli odnosi się do tabeli:

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

Następnie wstawiasz wartość w obu:

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

Teraz chcesz zmienić odniesienie na on update cascade :

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

I zaktualizuj go:

update referenced set id = 2;

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

Teraz będziesz mieć inny problem w kluczu podstawowym tabeli, do której odwołuje się odwołanie, jeśli zaktualizowany identyfikator już istnieje. Ale to spowodowałoby kolejne pytanie.

AKTUALIZACJA

Jest to niebezpieczne, więc najpierw wykonaj kopię zapasową bazy danych. Należy to zrobić jako superużytkownik:

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

Zmieni wszystkie ograniczenia klucza obcego w tabeli odniesienia na on update cascade



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy mogę wycofać już zatwierdzoną transakcję? (utrata danych)

  2. Heroku Postgres Połączenie z aplikacji PHP localhost

  3. Problem Jpa ManytoMany z Spring Boot

  4. Postgres GIST vs indeks Btree

  5. Jak porównywać wydajność PostgreSQL