sql >> Databáze >  >> RDS >> Oracle

Odstranění řádků z nadřazených a podřízených tabulek

Dva možné přístupy.

  1. Pokud máte cizí klíč, deklarujte jej jako kaskáda smazání a odstraňte nadřazené řádky starší než 30 dní. Všechny podřízené řádky budou automaticky smazány.

  2. Na základě vašeho popisu to vypadá, že znáte nadřazené řádky, které chcete odstranit, a potřebujete odstranit odpovídající podřízené řádky. Zkoušeli jste takto SQL?

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

    -- nyní odstraňte záznamy nadřazené tabulky

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

---- Na základě vašeho požadavku to vypadá, že možná budete muset použít PL/SQL. Uvidím, jestli někdo dokáže poslat čisté SQL řešení (v tom případě by to byla určitě správná cesta).

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. Amazon EC2, mysql se ruší, protože InnoDB:mmap (x bajtů) se nezdařilo; chyba 12

  2. Dynamická SQL LOOP

  3. Napište číslo se dvěma desetinnými místy SQL Server

  4. Instalace Perl DBD::Oracle Module