sql - Deleting rows from parent and child tables -
assume 2 tables in oracle 10g
tablea (parent) --> tableb (child)
every row in tablea has several child rows related in tableb.
i want delete specific rows in tablea means have delete related rows in tableb first.
this deletes child entries
delete tableb last_update_dtm = sysdate-30;
to delete parent rows rows deleted in child table this
delete tablea not exists (select 1 tableb tablea.key=tableb.key);
the above will delete rows in child table (last_update_dtm = sysdate-30) false. tablea not have last_update_dtm column there no way of knowing rows delete without entries in child table.
i save keys in child table prior deleting seems expensive approach. correct way of deleting rows in both tables?
edit
to explain better trying achieve, following query have done trying if there no constraint between 2 table.
delete tablea exists ( select 1 tableb tablea.key=tableb.key , tableb.last_update_dtm=sysdate-30) delete tableb last_update_dtm=systdate-30
two possible approaches.
if have foreign key, declare on-delete-cascade , delete parent rows older 30 days. child rows deleted automatically.
based on description, looks know parent rows want delete , need delete corresponding child rows. have tried sqls this?
delete child_table parent_id in ( select parent_id parent_table updd_tms != (sysdate-30)
-- delete parent table records
delete parent_table updd_tms != (sysdate-30);
---- based on requirement , looks might have use pl/sql. i'll see if can post pure sql soution (in case definetely way go).
declare v_sqlcode number; pragma exception_init(foreign_key_violated, -02291); begin v_rec in (select parent_id, child id child_table updd_tms != (sysdate-30) ) loop -- delete children delete child_table child_id = v_rec.child_id; -- delete parent. if foreign key violation, -- stop step , continue loop begin delete parent_table parent_id = v_rec.parent_id; exception when foreign_key_violated null; end; end loop; end; /
Comments
Post a Comment