Этот вопрос возникает время от времени. Нет, не очень чистый способ сделать это. Вы должны изменить все строки в дочерней таблице, которые зависят от нежелательных значений в родительской таблице, прежде чем вы сможете удалить ненужные строки в родительской таблице.
MySQL поддерживает многотабличные операторы UPDATE
и DELETE
(в отличие от других брендов баз данных), поэтому вы можете выполнять несколько изящных приемов, таких как:
UPDATE names n1
JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name)
JOIN child_table c ON (n2.id = c.id)
SET c.name_id = n1.id
ORDER BY n1.id DESC;
После того, как вы сделали это для всех дочерних таблиц, вы можете использовать многотабличный синтаксис MySQL DELETE
для удаления ненужных строк в родительской таблице:
DELETE FROM n2
USING names n1 JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name);