子ローを削除してから別のsqlステートメントを作成して親ローを削除するのではなく、両方を行うステートメントを1つ使用したかったのです。参考資料:Oracleデータベースを使用しています。1つのSQLスクリプトで子ローと親ローを削除する
アップデート:私はcascading deletesを使用して外部キーを定義CASCADE
子ローを削除してから別のsqlステートメントを作成して親ローを削除するのではなく、両方を行うステートメントを1つ使用したかったのです。参考資料:Oracleデータベースを使用しています。1つのSQLスクリプトで子ローと親ローを削除する
アップデート:私はcascading deletesを使用して外部キーを定義CASCADE
あなたはいつもあなたが親行を削除すると、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
ステートメントを使用している可能性があります。
ありがとうございました。ただし、テーブルを作成したり、ON DELETE CASCADEを変更する権限はありません。テーブルにはすでに数千ものレコードがあります。だから私は2つのSQLステートメントを行った。 – WowBow
もう一つの理由(私たちは不明な理由から、制約として外部キーを使用しないでください - はいはい)これを行うには、削除の後(または前に)トリガーを作成することです。
もう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;
delete from
(
select * from parent join child using (id)
where id = 1
)
WARNING!親と子の両方の行が存在する場所のみを削除します。子供がいない親を削除しないでください
私の外部キー制約でDELETE ON CASCADEを使用してください。 – Teja