Đây là khá nhiều khóa chính, khóa ngoại và các mệnh đề như ON DELETE CASCADE
là cho. Nếu vẫn chưa quá muộn, bạn có thể thử thêm các ràng buộc PK và FK trước khi thực hiện bất kỳ thao tác xóa nào; thì mọi thứ sẽ dễ dàng.
ĐÃ THÊM :Dựa trên thảo luận thêm. Truy vấn dưới đây có thể được sử dụng để tìm tất cả các bảng con của bảng mẹ. Truy vấn có thể được cải thiện theo nhiều cách, nhưng nó có thể là một điểm khởi đầu OK.
with f as (
select constraint_name, table_name, r_constraint_name
from user_constraints
where constraint_type = 'R'
),
p as (
select constraint_name, table_name
from user_constraints
where constraint_type = 'P'
),
j (child_table, f_key, parent_table, p_key) as (
select f.table_name, f.constraint_name, p.table_name, f.r_constraint_name
from p join f on p.constraint_name = f.r_constraint_name
union all
select 'EMPLOYEES', (select constraint_name from p
where table_name = 'EMPLOYEES'), null, null from dual
)
select level as lvl, j.*
from j
start with parent_table is null
connect by nocycle parent_table = prior child_table
order by lvl, parent_table, child_table;
Bảng "cha" trong trường hợp này là NHÂN VIÊN và tên xuất hiện hai lần, trên cùng một dòng. Điều đó có thể được tạo thành một biến ràng buộc nếu cần. Tôi đã sử dụng NHÂN VIÊN (lưu ý:nó phải được viết hoa toàn bộ vì đó là cách các giá trị chuỗi được lưu trữ trong bảng hệ thống) vì tôi đã chạy điều này trên giản đồ HR chuẩn; đầu ra:
LVL CHILD_TABLE F_KEY PARENT_TABLE P_KEY
----- ----------------- -------------------- ----------------- -----------------
1 EMPLOYEES EMP_EMP_ID_PK
2 DEPARTMENTS DEPT_MGR_FK EMPLOYEES EMP_EMP_ID_PK
2 JOB_HISTORY JHIST_EMP_FK EMPLOYEES EMP_EMP_ID_PK
3 JOB_HISTORY JHIST_DEPT_FK DEPARTMENTS DEPT_ID_PK