Deleting rows from parent and child tables

前端 未结 3 1822
后悔当初
后悔当初 2020-12-14 13:25

Assume two tables in Oracle 10G

TableA (Parent) --> TableB (Child)

Every row in TableA has several child rows related to it in TableB. <

3条回答
  •  情歌与酒
    2020-12-14 13:45

    Two possible approaches.

    1. If you have a foreign key, declare it as on-delete-cascade and delete the parent rows older than 30 days. All the child rows will be deleted automatically.

    2. Based on your description, it looks like you know the parent rows that you want to delete and need to delete the corresponding child rows. Have you tried SQL like this?

        delete from child_table
            where parent_id in (
                 select parent_id from parent_table
                      where updd_tms != (sysdate-30)
      

      -- now delete the parent table records

      delete from parent_table
      where updd_tms != (sysdate-30);
      

    ---- Based on your requirement, it looks like you might have to use PL/SQL. I'll see if someone can post a pure SQL solution to this (in which case that would definitely be the way to go).

    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;
    /
    

提交回复
热议问题