Как удалить две строки, которые отличаются только по идентификатору - PullRequest
3 голосов
/ 19 декабря 2008

У меня есть скрипт, который дважды вставляет в базу данных с теми же данными. Есть ли хороший способ сделать это (без сканирования, вставки каждой записи в массив, а затем удаления повторяющихся записей массива)?

Ответы [ 4 ]

10 голосов
/ 19 декабря 2008
DELETE
FROM t
WHERE ID IN (
    SELECT MAX(ID)
    FROM t
    GROUP BY {Your Group Criteria Here}
    HAVING COUNT(*) > 1
)
2 голосов
/ 19 декабря 2008

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

DELETE t2
 FROM mytable t1 JOIN mytable t2
  USING (column1, column2, column3) -- this is an equi-join
WHERE t1.id < t2.id;
1 голос
/ 19 декабря 2008

Или старый простой способ, я бы удивился, если бы он не был самым быстрым. Особенно быстрее, чем сопоставление с агрегатной функцией GROUP BY.

УДАЛИТЬ ИЗ mytable m1
ГДЕ СУЩЕСТВУЕТ
( ВЫБЕРИТЕ 1 ИЗ mytable
ГДЕ поля = m1.fields
И id

0 голосов
/ 19 декабря 2008

Если у вас сейчас нет ссылок на таблицу по ключу, я бы сделал mysqldump --complete-insert, удалил первичные ключи, изменил определение таблицы, чтобы применить какой-то уникальный ключ или другой, который бы перехватывал ваш дубликаты, измените INSERT на REPLACEs и загрузите данные обратно. Получает хорошую чистую таблицу без дырок в последовательности PK или удаленных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...