У меня есть таблицы 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- стол-оракул
Вы можете создать индекс внешнего ключа с параметром удаления каскада для удаления записей в других таблицах.
В вашем случае создайте индекс внешнего ключа в B и C, где A имеет параметр каскадного удаления. Поэтому, когда вы удаляете запись в A, соответствующие значения ключей будут удалены и в других таблицах.
Сначала вы должны удалить таблицы с помощью внешних ключей, прежде чем сможете удалить исходную запись, которую они ссылаются. Но вы можете написать скрипт, который будет собирать идентификаторы записей в таблице A из таблиц B и C. Удалите записи в B и C, а затем проведите цикл по списку идентификаторов, чтобы удалить их из таблицы A.
B
илиC
, то всяA
должна быть удалена? Это может привести к ошибке ограничения ключа, если есть другие (не удаленные) дочерние элементы, все еще ссылающиеся наA
Кажется, что вы хотели быON DELETE CASCADE
здесь, но опять же, это не имеет смысла каскадное удаление от детей к родителям.