2012-03-09 8 views
12

子ローを削除してから別のsqlステートメントを作成して親ローを削除するのではなく、両方を行うステートメントを1つ使用したかったのです。参考資料:Oracleデータベースを使用しています。1つのSQLスクリプトで子ローと親ローを削除する

アップデート:私はcascading deletesを使用して外部キーを定義CASCADE

+0

私の外部キー制約でDELETE ON CASCADEを使用してください。 – Teja

答えて

12

ON DELETE行うための権限を持っていけません。次に、 "親"行を削除するだけです。

+1

まあ、私はそれを行う特権を持っていません。 – WowBow

+2

@WowBow - 次に2つの 'DELETE'文が必要です – Lamak

+1

ur DBAに問い合わせてください。 – Teja

1

あなたはいつもあなたが親行を削除すると、Oracleは子供が例えば自動的に

create table parent (
    parentID number primary key, 
    parentData varchar2(100) 
); 

create table child (
    childID number primary key, 
    parentID number references parent(parentID) on delete cascade, 
    childData varchar2(100) 
); 

削除しないように、あなたは外部キー制約を宣言することができ、子供を削除したい場合は、親テーブルを宣言し、子表を作成し、親行を削除すると自動的に子行を削除します。あなたがそのようなことを自動的に強制したくない場合や、バックグラウンドで「自動的に」起こったときに追加される複雑さが気に入らない場合は、複数のDELETEステートメントを使用している可能性があります。

+0

ありがとうございました。ただし、テーブルを作成したり、ON DELETE CASCADEを変更する権限はありません。テーブルにはすでに数千ものレコードがあります。だから私は2つのSQLステートメントを行った。 – WowBow

0

もう一つの理由(私たちは不明な理由から、制約として外部キーを使用しないでください - はいはい)これを行うには、削除の後(または前に)トリガーを作成することです。

もう1つの削除クエリを書き込む必要がありますが、トリガーにのみ挿入してください。

しかし、あなたはカスケード削除を置くことができない場合、私はあなたがトリガーを追加することができますかわからない...

1

あなただけひどくそれを行うことができます - つまり、トリガーを使用。

create table parent 
(pid number, 
    constraint parent_pk 
    primary key (pid) 
    using index 
); 

create table child 
    (cid number, 
    pid number, 
    constraint child_pk 
    primary key(cid) 
    using index, 
    constraint child_fk 
    foreign key (pid) 
    references parent (pid) 
); 

create index child_fk on child (pid); 

create trigger fake_delete_cascade 
before delete on parent 
for each row 
begin 
    delete from child where pid = :old.pid; 
end; 
/

insert into parent values (1); 
insert into child values (1,1); 
commit; 
select count(*) from child; 
delete from parent where pid = 1; 
select count(*) from child; 
3
delete from 
(
select * from parent join child using (id) 
where id = 1 
) 

WARNING!親と子の両方の行が存在する場所のみを削除します。子供がいない親を削除しないでください

関連する問題