Hai cách tiếp cận khả thi.
-
Nếu bạn có khóa ngoại, hãy khai báo khóa đó dưới dạng khi xóa và xóa các hàng mẹ cũ hơn 30 ngày. Tất cả các hàng con sẽ tự động bị xóa.
-
Dựa trên mô tả của bạn, có vẻ như bạn biết các hàng mẹ mà bạn muốn xóa và cần xóa các hàng con tương ứng. Bạn đã thử SQL như thế này chưa?
delete from child_table where parent_id in ( select parent_id from parent_table where updd_tms != (sysdate-30)
- bây giờ xóa các bản ghi bảng mẹ
delete from parent_table where updd_tms != (sysdate-30);
---- Dựa trên yêu cầu của bạn, có vẻ như bạn có thể phải sử dụng PL / SQL. Tôi sẽ xem liệu ai đó có thể đăng một giải pháp SQL thuần túy cho vấn đề này hay không (trong trường hợp đó, đó chắc chắn sẽ là cách tốt nhất).
declare
v_sqlcode number;
PRAGMA EXCEPTION_INIT(foreign_key_violated, -02291);
begin
for v_rec in (select parent_id, child id from child_table
where updd_tms != (sysdate-30) ) loop
-- delete the children
delete from child_table where child_id = v_rec.child_id;
-- delete the parent. If we get foreign key violation,
-- stop this step and continue the loop
begin
delete from parent_table
where parent_id = v_rec.parent_id;
exception
when foreign_key_violated
then null;
end;
end loop;
end;
/