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

Cách liệt kê các bảng bị ảnh hưởng bởi xóa theo tầng

Sử dụng pg_depend . Ví dụ:

create table master (id int primary key);
create table detail_1 (id int, master_id int references master(id) on delete restrict);
create table detail_2 (id int, master_id int references master(id) on delete cascade);

select pg_describe_object(classid, objid, objsubid)
from pg_depend 
where refobjid = 'master'::regclass and deptype = 'n';

                  pg_describe_object
------------------------------------------------------
 constraint detail_1_master_id_fkey on table detail_1
 constraint detail_2_master_id_fkey on table detail_2
(2 rows)

deptype = 'n' nghĩa là:

SỰ PHỤ THUỘC BÌNH THƯỜNG - Mối quan hệ bình thường giữa các đối tượng được tạo riêng biệt. Đối tượng phụ thuộc có thể được loại bỏ mà không ảnh hưởng đến đối tượng được tham chiếu. Đối tượng được tham chiếu chỉ có thể được loại bỏ bằng cách xác định CASCADE, trong trường hợp đó, đối tượng phụ thuộc cũng bị loại bỏ.

Sử dụng pg_get_constraintdef() để nhận các định nghĩa ràng buộc:

select 
    pg_describe_object(classid, objid, objsubid), 
    pg_get_constraintdef(objid)
from pg_depend 
where refobjid = 'master'::regclass and deptype = 'n';


                  pg_describe_object                  |                       pg_get_constraintdef
------------------------------------------------------+------------------------------------------------------------------
 constraint detail_1_master_id_fkey on table detail_1 | FOREIGN KEY (master_id) REFERENCES master(id) ON DELETE RESTRICT
 constraint detail_2_master_id_fkey on table detail_2 | FOREIGN KEY (master_id) REFERENCES master(id) ON DELETE CASCADE
(2 rows)

Để tìm chuỗi phụ thuộc xếp tầng đầy đủ, chúng ta nên sử dụng đệ quy và xem danh mục pg_constraint để lấy id của một bảng phụ thuộc.

with recursive chain as (
    select classid, objid, objsubid, conrelid
    from pg_depend d
    join pg_constraint c on c.oid = objid
    where refobjid = 'the_table'::regclass and deptype = 'n'
union all
    select d.classid, d.objid, d.objsubid, c.conrelid
    from pg_depend d
    join pg_constraint c on c.oid = objid
    join chain on d.refobjid = chain.conrelid and d.deptype = 'n'
    )
select pg_describe_object(classid, objid, objsubid), pg_get_constraintdef(objid)
from chain;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự cố với createb trong postgres

  2. Làm cách nào để bạn in kết quả của một truy vấn PostgreSQL ở định dạng CSV hoặc TSV từ dòng lệnh?

  3. SQL động (EXECUTE) làm điều kiện cho câu lệnh IF

  4. Cách Atand () hoạt động trong PostgreSQL

  5. Sách “Hiệu suất cao PostgreSQL 9.0” đã ra mắt