Oracle删除含关联子表外键的父表新增重复记录问题咨询
问题核心原因
现有删除语句仅按rowid排序保留第一条记录,没有优先保留已关联表B的旧记录,会误删存在子关联的A表数据,触发外键约束。
解决方案1:调整窗口函数排序规则(推荐)
修改row_number的排序逻辑,优先保留已关联表B的记录,再按插入时间升序保留更早的有效记录,确保每个Account_Number+Party_Number分组下的有效业务记录不会被误删:
delete from A where rowid IN ( select rid from ( select rowid rid, row_number() over ( partition by account_number,party_number order by case when exists (select 1 from B where B.ID = A.ID) then 1 else 2 end, time asc ) rn from A ) where rn <> 1 );
解决方案2:新增删除限制条件
直接给删除逻辑加过滤规则,仅允许删除未关联表B的记录,从根源避免触发外键约束:
delete from A a where rowid > ( select min(rowid) from A b where b.account_number=a.account_number and b.party_number=a.party_number ) and not exists (select 1 from B where B.ID = a.ID);
内容的提问来源于stack exchange,提问作者prudhvi bikumalla
相关产品推荐
相关产品推荐

