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;