sql >> Database teknologi >  >> RDS >> Oracle

Sletning af rækker fra overordnede og underordnede tabeller

To mulige tilgange.

  1. Hvis du har en fremmednøgle, skal du erklære den som on-delete-cascade og slette de overordnede rækker, der er ældre end 30 dage. Alle underordnede rækker slettes automatisk.

  2. Baseret på din beskrivelse ser det ud til, at du kender de overordnede rækker, som du vil slette og skal slette de tilsvarende underordnede rækker. Har du prøvet SQL som denne?

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

    -- slet nu de overordnede tabelposter

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

---- Baseret på dit krav ser det ud til, at du muligvis skal bruge PL/SQL. Jeg vil se, om nogen kan sende en ren SQL-løsning til dette (i så fald ville det helt sikkert være vejen at gå).

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


  1. Neo4j - Valg af data med MATCH ved hjælp af Cypher

  2. Django + Postgres + Large Time Series

  3. korrekt dvale-annotering for byte[]

  4. Oracle DB Server + APEX + ORDS + JasperRapporter fra bunden (del 1)