PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL - правилна промяна на ID на реда на таблицата

Да предположим, че имате тези две таблици:

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

Таблицата препраща към таблицата, към която се препраща:

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

След това вмъквате стойност и в двете:

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

Сега искате да промените препратката към on update cascade :

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

И го актуализирайте:

update referenced set id = 2;

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

Сега ще имате друг проблем в първичния ключ на реферираната таблица, ако актуализираният идентификатор вече съществува. Но това би породило друг въпрос.

АКТУАЛИЗАЦИЯ

Това е опасно, така че първо архивирайте db. Трябва да се направи като суперпотребител:

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

Той ще промени всички ограничения на външния ключ на референтната таблица на 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. ЗА ВСЯКО ИЗЯВЛЕНИЕ пример за тригер

  2. Кумулативен сбор от стойности по месеци, попълване на липсващите месеци

  3. Функции на Postgres

  4. ИЗТРИВАНЕ на рекурсивен PostgreSQL

  5. Актуализиране на активен запис Всички JSON полета