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 сообщений, а затем выполняем удаление записей из таблиц (связанных и основной)

Комментарии

Популярные сообщения из этого блога

Linux (РедОС). Сброс пароля

TRUNCATE / DELETE / DROP или как очистить таблицу

КБК. КВФО - Код вида финансового обеспечения (деятельности)

SQL Error [53200]: ОШИБКА: нехватка разделяемой памяти Подсказка: Возможно, следует увеличить параметр max_locks_per_transaction

РедОС. Подключение к сетевой папке