SQL удаляет строки путем выбора внешних ключей

63
3

Я новичок в SQL и хотел бы написать скрипт, который удаляет строки из 2 таблиц базы данных MySQL.

У меня есть события и участники, и я хочу удалить все данные участников и событий из событий старше 90 дней. Поэтому мне нужно найти массив event_ids старых событий, а затем удалить всех участников, ссылающихся на любой event_id в этом массиве.

Какой лучший способ решить это? Вот моя идея:

DELETE * FROM attendees WHERE event_id = ANY (SELECT id FROM events WHERE enddate <= DATE_ADD(CURDATE(), INTERVAL -90 DAY))

DELETE * FROM events WHERE enddate <= DATE_ADD(CURDATE(), INTERVAL -90 DAY)

спросил(а) 2021-01-25T18:54:08+03:00 5 месяцев назад
1
Решение
64

Удалить запрос не следует использовать *

DELETE  FROM attendees WHERE event_id = IN  (SELECT id FROM events WHERE enddate <= DATE_ADD(CURDATE(), INTERVAL -90 DAY))

DELETE FROM events WHERE enddate <= DATE_ADD(CURDATE(), INTERVAL -90 DAY)

(EDIT: добавлено ANY для работы с несколькими строками в подзапросе)

ответил(а) 2021-01-25T18:54:08+03:00 5 месяцев назад
45

Вы должны настроить отношение внешнего ключа от attendees к event с on delete cascade.

Затем, когда вы удаляете событие, участники автоматически будут удалены.

Вы можете узнать больше об отношениях с иностранными ключами здесь.

ответил(а) 2021-01-25T18:54:08+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема