1

DEV データベースからいくつかの不良データをクリーンアップしようとしています (誰もが自己テスト用にデータを挿入できます)、外部キー制約を介して RI を追加しようとしています。テーブルは FK 用に設定されていますが、データは設定されていません。

複合キーに違反する (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: Missing 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; 

このデータを簡単に削除する別の方法はありますか?

4

3 に答える 3

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 add constraint を再実行するだけです。

詳細については、http: //docs.oracle.com/cd/E11882_01/server.112/e41084/clauses002.htm#SQLRF52228を参照してください。

それが役立つことを願って....

于 2013-10-30T06:28:08.550 に答える
0

または:

delete from childtable 
where (key1,key2) not in 
    (select key1,key2 from parenttable)
于 2013-10-30T07:16:54.367 に答える
0

考えられる解決策は次のとおりです。

delete
  from childTable
 where not exists (select null
                     from parentTable
                    where childTable.key1 = parentTable.key1
                      and childTable.key2 = parentTable.key2);
于 2013-10-30T07:18:49.143 に答える