В дополнение к ответам, уже приведенным с несколькими операторами SQL, связями внешнего ключа и триггерами.В InterBase вы также можете написать хранимую процедуру для удаления основной и подробной записей.Тогда вам понадобится только один оператор SQL в вашей программе.
Ниже приведены два вида хранимых процедур, которые вы можете использовать в этой ситуации.
Первый из них почти такой же, как ответ 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 является первичным ключом, то первый оператор 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)
BTW.Я почти всегда использую хотя бы один возвращаемый параметр в SP.Это позволит использовать компонент Query для вызова хранимой процедуры.
Если параметры результата отсутствуют, для выполнения SP должен использоваться компонент хранимой процедуры.