Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Usuwanie wierszy z tabel nadrzędnych i podrzędnych

Dwa możliwe podejścia.

  1. Jeśli masz klucz obcy, zadeklaruj go jako kaskadowo usuwany i usuń wiersze nadrzędne starsze niż 30 dni. Wszystkie wiersze podrzędne zostaną automatycznie usunięte.

  2. Na podstawie Twojego opisu wygląda na to, że znasz wiersze nadrzędne, które chcesz usunąć, i musisz usunąć odpowiadające im wiersze podrzędne. Czy wypróbowałeś SQL w ten sposób?

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

    -- teraz usuń rekordy tabeli nadrzędnej

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

---- W oparciu o twoje wymagania, wygląda na to, że będziesz musiał użyć PL/SQL. Zobaczę, czy ktoś może opublikować na to rozwiązanie w postaci czystego SQL (w takim przypadku zdecydowanie byłoby to do zrobienia).

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobieranie wiadomości ze skrzynki pocztowej za pomocą interfejsu API Mail_Client PL/SQL

  2. Zapytanie SQL w celu znalezienia brakujących wierszy między dwiema powiązanymi tabelami

  3. Generuj dane testowe za pomocą programisty Oracle PL/SQL

  4. dbms_output size przepełnienie bufora

  5. Konwertuj datę ciągu na datę i godzinę w Oracle