SQL. Очистка записей из связанных таблиц
Дано: Есть 2 таблицы "Сообщения" и "Архив сообщений", вторая содержит только ссылку на первую и дату отправки в архив.
Задача: Почистить сообщения.
Решение:
Для решения можно было написать 2 скрипта, которые сначала удаляют записи из таблицы "Архив сообщений", а потом из таблицы "Сообщения" (такая очередность обусловлена тем, что в архиве сообщения есть ссылки FK). Выглядеть это будет так:DELETE FROM ARCHIVEMAILUSER
WHERE MAIL_ID IN (SELECT ID FROM MAIL
WHERE CREATE_DATE >= to_date ('01.01.2022', 'dd.mm.yyyy') AND CREATE_DATE < to_date ('02.02.2022', 'dd.mm.yyyy'));
DELETE FROM MAIL
WHERE CREATE_DATE >= to_date ('01.01.2022', 'dd.mm.yyyy') AND CREATE_DATE < to_date ('02.02.2022', 'dd.mm.yyyy');
- Но что, делать если связанных таблиц больше?
- Использовать PL/SQL!
Запрос будет выглядеть следующим образом:
--#ORACLE
begin
for cur in (SELECT id FROM MAIL WHERE CREATE_DATE >= to_date ('01.01.2022', 'dd.mm.yyyy') AND CREATE_DATE < to_date ('02.02.2022', 'dd.mm.yyyy'))
loop
delete from ARCHIVEMAILUSER a WHERE a.MAIL_ID = cur.id;
delete from MAIL m WHERE m.ID = cur.id;
end loop;
end;
Сначала мы отбираем ID сообщений, а затем выполняем удаление записей из таблиц (связанных и основной)
Комментарии
Отправить комментарий