Есть ли чистый способ очистки повторяющихся записей в MySQL? - PullRequest
2 голосов
/ 31 октября 2008

В таблице у меня есть три столбца - id, name и count. Большое количество столбцов с именами идентичны (из-за отсутствия УНИКАЛЬНОГО в начале), и я хочу это исправить. Тем не менее, столбец id используется другими (4 или 5, я думаю - мне нужно проверить документы) таблицами, чтобы найти имя, и простое их удаление может сломать вещи. Так есть ли хороший, чистый способ сказать «найти все идентичные записи и объединить их вместе»?

Ответы [ 2 ]

4 голосов
/ 31 октября 2008

Этот вопрос возникает время от времени. Нет, не очень чистый способ сделать это. Вы должны изменить все строки в дочерней таблице, которые зависят от нежелательных значений в родительской таблице, прежде чем вы сможете удалить ненужные строки в родительской таблице.

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);
0 голосов
/ 31 октября 2008

Почему ты не можешь сделать что-то вроде

update dependent_table set name_id = <id you want to keep> where name_id in (
    select id from names where name = 'foo' and id != <id you want to keep>)
...