2013-10-30 64 views
1

我試圖從DEV數據庫中清除一些不良數據(每個人都有能力爲自我測試插入數據)並通過外鍵約束添加RI。這些表格是爲FKs設置的,但是,數據不是。Oracle刪除數據,這將違反將被添加的外鍵

是否有一個相對簡單的方法來刪除(tobe)子表中的數據,這將違反組合鍵?

CREATE TABLE parentTable 
    (key1 VARCHAR2(1) NOT NULL 
    , key2 VARCHAR2(1) NOT NULL 
    ); 

CREATE TABLE childTable 
    (key1 VARCHAR2(1) NOT NULL 
    , key2 VARCHAR2(1) NOT NULL 
    , key3 VARCHAR2(1) NOT NULL 
    ); 

ALTER TABLE parentTable ADD CONSTRAINT pk_parentTable primary key(key1,key2); 
ALTER TABLE childTable ADD CONSTRAINT pk_childTable primary key(key1,key2,key3); 

insert into parentTable values('0','A'); 
insert into parentTable values('0','B'); 
insert into parentTable values('1','C'); 

insert into childTable values('0','A','X'); 
insert into childTable values('0','B','Y'); 
insert into childTable values('1','C','X'); 
insert into childTable values('0','C','X'); -- bad data 

我一直用來識別不良數據的查詢如下。

select distinct key1, key2 from childTable 
    minus 
    select distinct key1, key2 from parentTable; 

我該如何把這個結果集從子表中刪除。按照邏輯,我試圖使用下面的查詢,但它給出了一個ORA-00928的錯誤:缺少SELECT。

with x as(
select distinct key1, key2 from childTable 
minus 
select distinct key1, key2 from parentTable 
) 
delete from childtable where key1 = x.key1 AND key2 = x.key2; 

有沒有另一種方法可以輕鬆刪除這些數據?

回答

0

或者:

delete from childtable 
where (key1,key2) not in 
    (select key1,key2 from parenttable) 
1

Oracle實際上有一些內置的功能來處理這個問題。

首先,運行@?/rdbms/admin/utlexcpt.sql創建異常表。

然後,(嘗試)添加FK約束,就像這樣:

alter table childtable add constraint my_fk foreign key (key1,key2) references parenttable(key1,key2) exceptions into exceptions; 

這要麼完成,否則會報錯了。如果出錯,那麼違反約束的行的id將在異常表中。

然後,它是執行一個簡單的問題:

delete from childtable where rowid in(select row_id from exceptions); 

然後,只需重新執行ALTER TABLE上面添加約束。

更多細節可以在這裏找到: http://docs.oracle.com/cd/E11882_01/server.112/e41084/clauses002.htm#SQLRF52228

希望幫助....

0

一個可能的解決方案是:

delete 
    from childTable 
where not exists (select null 
        from parentTable 
        where childTable.key1 = parentTable.key1 
         and childTable.key2 = parentTable.key2); 
相關問題