sql >> Databasteknik >  >> RDS >> Oracle

Ta bort rader från överordnade och underordnade tabeller

Två möjliga tillvägagångssätt.

  1. Om du har en främmande nyckel, deklarera den som on-delete-cascade och ta bort de överordnade raderna som är äldre än 30 dagar. Alla underordnade rader kommer att raderas automatiskt.

  2. Baserat på din beskrivning ser det ut som att du känner till de överordnade raderna som du vill ta bort och behöver ta bort motsvarande underordnade rader. Har du testat SQL så här?

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

    -- radera nu de överordnade tabellposterna

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

---- Baserat på dina krav, ser det ut som att du kanske måste använda PL/SQL. Jag ska se om någon kan lägga upp en ren SQL-lösning på detta (i så fall skulle det definitivt vara rätt väg att 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. Hur fyller man i kalendertabellen i Oracle?

  2. Jämför Oracle RAC HA-lösning med Galera Cluster för MySQL eller MariaDB

  3. Fråga jämföra datum i SQL

  4. Ladda upp CSV-fil till SQL-server