PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL - ubah ID baris tabel dengan benar

Misalkan Anda memiliki dua tabel ini:

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

Tabel referensi referensi tabel referensi:

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

Kemudian Anda memasukkan nilai di keduanya:

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

Sekarang Anda ingin mengubah referensi ke on update cascade :

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

Dan perbarui:

update referenced set id = 2;

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

Sekarang Anda akan memiliki masalah lain di kunci utama tabel yang direferensikan jika id yang diperbarui sudah ada. Tapi itu akan membuat pertanyaan lain.

PERBARUI

Ini berbahaya jadi buat cadangan db terlebih dahulu. Itu harus dilakukan sebagai pengguna super:

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

Ini akan mengubah semua batasan kunci asing pada tabel yang direferensikan menjadi 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. Masalah regex postgres

  2. Strategi efektif untuk meninggalkan jejak audit/riwayat perubahan untuk aplikasi DB?

  3. Baca file CSV/Excel dari file SFTP, buat beberapa perubahan pada file tersebut menggunakan Pandas, dan simpan kembali

  4. Postgres - Melewati nama tabel sebagai parameter dan menyimpan hasil dalam file

  5. Menemukan hutan yang merentang (DENGAN RECURSIVE, PostgreSQL 9.5)