PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL - thay đổi đúng ID của hàng bảng

Giả sử bạn có hai bảng sau:

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

Bảng tham chiếu trình tham chiếu bảng được tham chiếu:

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

Sau đó, bạn chèn một giá trị vào cả hai:

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

Bây giờ bạn muốn thay đổi tham chiếu thành on update cascade :

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

Và cập nhật nó:

update referenced set id = 2;

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

Bây giờ bạn sẽ gặp một vấn đề khác trong khóa chính của bảng được tham chiếu nếu id được cập nhật đã tồn tại. Nhưng điều đó sẽ tạo ra một câu hỏi khác.

CẬP NHẬT

Điều này rất nguy hiểm vì vậy hãy sao lưu db trước. Nó phải được thực hiện như superuser:

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

Nó sẽ thay đổi tất cả các ràng buộc khóa ngoại trên bảng được tham chiếu thành 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. Làm cách nào để sử dụng thành phần Java của Máy chủ PostgreSQL Nhúng như một dịch vụ riêng biệt?

  2. postgresql với hàm quấn sql quá chậm?

  3. Nhà cung cấp dịch vụ đám mây chuyên sâu:PostgreSQL trên DigitalOcean

  4. Sao chép cơ sở dữ liệu PostgreSQL vào cơ sở dữ liệu khác

  5. Kết nối bộ chứa postgreSQL + postGIS docker từ mạng cục bộ của tôi