sql >> Base de Datos >  >> RDS >> Oracle

Eliminación de filas de tablas principales y secundarias

Dos enfoques posibles.

  1. Si tiene una clave externa, declárela como on-delete-cascade y elimine las filas principales que tengan más de 30 días. Todas las filas secundarias se eliminarán automáticamente.

  2. Según su descripción, parece que conoce las filas principales que desea eliminar y necesita eliminar las filas secundarias correspondientes. ¿Has probado SQL como este?

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

    -- ahora elimine los registros de la tabla principal

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

---- Según sus requisitos, parece que tendrá que usar PL/SQL. Veré si alguien puede publicar una solución de SQL puro para esto (en cuyo caso, ese sería definitivamente el camino a seguir).

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