Удалить родительские строки на основе ранее удаленных дочерних строк

0

У меня есть таблицы A, B и C. Таблица A является родительской таблицей B и C. Теперь в моем командном файле она имеет этот оператор удаления, где он удаляет записи из таблиц B и C:

DELETE b.*, c.*
FROM tableB AS b
LEFT JOIN tableC AS c
   ON c.tableB_id = b.id
WHERE c.date IS NULL
AND DATE(c.updated_at) != CURDATE()

Я хотел бы удалить все записи из таблицы A, где id (первичный ключ таблицы) равен тем, которые были удалены из инструкции DELETE выше.

Кроме того, обе таблицы B и C имеют столбец (скажем, tableA_id), который является внешним ключом к таблице A. Я пробовал следующие запросы, но я не думаю, что это правильно, потому что они не основываются на предыдущий оператор DELETE выше:

DELETE a FROM tableA a
WHERE a.id NOT IN (
    SELECT b.tableA_id FROM tableB b
)

DELETE a FROM tableA a
WHERE a.id NOT IN (
    SELECT c.tableA_id FROM tableC c
)

Мысли?

Изменение: у меня такая же проблема с этим, но она основана на oracle: https://dba.stackexchange.com/questions/49634/delete-rows-in-parent-table-based-on-criteria-in-child- стол-оракул

  • 0
    Возможно, ваше требование немного отклонено. Вы говорите, что если я удаляю одну дочернюю запись из B или C , то вся A должна быть удалена? Это может привести к ошибке ограничения ключа, если есть другие (не удаленные) дочерние элементы, все еще ссылающиеся на A Кажется, что вы хотели бы ON DELETE CASCADE здесь, но опять же, это не имеет смысла каскадное удаление от детей к родителям.
Теги:
sql-delete

2 ответа

0

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

В вашем случае создайте индекс внешнего ключа в B и C, где A имеет параметр каскадного удаления. Поэтому, когда вы удаляете запись в A, соответствующие значения ключей будут удалены и в других таблицах.

См. Http://www.mysqltutorial.org/mysql-on-delete-cascade/

0

Сначала вы должны удалить таблицы с помощью внешних ключей, прежде чем сможете удалить исходную запись, которую они ссылаются. Но вы можете написать скрипт, который будет собирать идентификаторы записей в таблице A из таблиц B и C. Удалите записи в B и C, а затем проведите цикл по списку идентификаторов, чтобы удалить их из таблицы A.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню