複数のSQL文、外部キー関係、およびトリガーで既に与えられている回答。 InterBaseでは、マスターレコードと詳細レコードを削除するストアドプロシージャを記述することもできます。次に、プログラムには1つのSQL文しか必要ありません。
この状況では、2種類のストアドプロシージャを使用できます。
最初のものはHeartWaveの回答とほぼ同じですが、その後はストアドプロシージャです。
CREATE PROCEDURE DELETEMASTERDETAIL_WITHOUTINFO(
pMasterID INTEGER)
RETURNS (
rResult INTEGER)
AS
declare variable vTable2ID integer;
begin
/* don't return information about deleted records */
rResult = 0;
for select id
from table2
where table1_id = :pMasterID
into :vTable2ID do
begin
delete from table3
where table2_id = :vTable2ID;
end
delete from table2
where table1_id = :pMasterID;
delete from table1
where id = :pMasterID;
rResult = rResult + 1;
suspend;
end
このストアドプロシージャを呼び出すためのSQL文は次のとおりです。
select rresult
from deletemasterdetail_withoutinfo(:pMasterID)
秒1は、テーブルごと削除されたレコードの量に関する情報を返します。私はあなたがそれを必要とするかどうかは分かりませんが、おそらくそれは他の人にとって有益です。 Table1のIDフィールドがプライマリキーの場合、最初のselectステートメントは少し過剰です。
CREATE PROCEDURE DELETEMASTERDETAIL_WITHINFO(
pMasterID INTEGER)
RETURNS (
rTable1Deleted INTEGER,
rTable2Deleted INTEGER,
rTable3Deleted INTEGER)
AS
declare variable vTable1ID integer;
declare variable vTable2ID integer;
declare variable vTable3ID integer;
begin
/* return information about deleted records */
rTable1Deleted = 0;
rTable2Deleted = 0;
rTable3Deleted = 0;
for select id
from table1
where id = :pMasterID
into :vTable1ID do
begin
for select id
from table2
where table1_id = :vTable1ID
into :vTable2ID do
begin
for select id
from table3
where table2_id = :vTable2ID
into :vTable3ID do
begin
rTable3Deleted = rTable3Deleted + 1;
delete from table3
where id = :vTable3ID;
end
rTable2Deleted = rTable2Deleted + 1;
delete from table2
where id = :vTable2ID;
end
rTable1Deleted = rTable1Deleted + 1;
delete from table1
where id = :vTable1ID;
end
suspend;
end
このストアドプロシージャを呼び出すためのSQL文は次のとおりです。ところで
select rtable1deleted, rtable2deleted, rtable3deleted
from deletemasterdetail_withinfo(:pMasterID)
。私はほとんど常にSPの少なくとも1つのリターンパラメータを使用します。これにより、クエリコンポーネントを使用してストアドプロシージャを呼び出すことができます。
結果パラメータがない場合は、SPを実行するためにストアドプロシージャコンポーネントを使用する必要があります。
カスケードオプションを使用して外部キー参照を作成する場合、親レコードを削除するとすべての詳細も削除されます。他の制限がこれを妨げない限り。 – mjn
すでにRDBMSを使用しているので、Wikipediaまたは他の場所で[参照整合性の利点](http://en.wikipedia.org/wiki/Referential_integrity#Benefits_of_Referential_Integrity)を参照してください。 –