Удалить строки из нескольких таблиц с помощью соединения
Я пытаюсь удалить строки из нескольких таблиц, которые связаны между собой. Но когда я запускаю хранимую процедуру, это затрагивает 0 строк. Как видите, функция довольно обширна, но идея в том, что она должна удалять строки из многих связанных таблиц.
Как я могу сделать эту работу?
CREATE DEFINER=`root`@`localhost` PROCEDURE `remove_tables_select1`(
IN in_TableA_ID INT
)
BEGIN
DELETE FROM TableB, TableC, TableD, TableE, TableA, TableF, TableG, TableH, TableI
using TableB
inner join TableC on (TableC.ID = TableB.TableC_ID)
inner join TableH on (TableH.TableB_ID = TableB.ID)
inner join TableD on (TableD.TableB_ID = TableB.ID)
inner join TableE on (TableE.TableB_ID = TableB.ID)
inner join TableA on (TableA.ID = in_TableA_ID)
inner join TableF on (TableF.TableA_ID = TableA.ID)
inner join TableG on (TableG.TableA_ID = TableA.ID)
inner join TableI on (TableI.TableH_ID = TableH.ID);
END
Небольшой пример:
CREATE DEFINER=`root`@`localhost` PROCEDURE `remove_tables_select1`(
IN in_TableA_ID INT
)
BEGIN
DELETE FROM TableA, TableB, TableC, TableD
using TableA
inner join TableB on (TableB.ID = TableA.TableB_ID)
inner join TableC on (TableC.TableB_ID = TableC.ID)
inner join TableD on (TableC.TableD_ID = TableD.ID)
WHERE TableA.ID = in_TableA_ID;
END
2 ответа
Для вашего меньшего примера попробуйте использовать следующий запрос -
DELETE a, b, c, d FROM TableA a
JOIN TableB b
ON b.ID = a.TableB_ID
JOIN TableC c
ON c.TableB_ID = c.ID
JOIN TableD d
ON c.TableD_ID = d.ID
WHERE
a.ID = in_TableA_ID;
Обратите внимание, что используется INNER JOIN; проверьте, что соответствующий запрос SELECT возвращает записи.
Это может привести к некоторым накладным расходам, но подумайте над использованием CASCADE
удаление для FOREING KEYS.