Как удалить дубликаты записей в базе данных MySQL? - PullRequest
13 голосов
/ 18 марта 2009

Каков наилучший способ удаления повторяющихся записей в базе данных mysql с использованием rails или запросов mysql?

Ответы [ 15 ]

0 голосов
/ 13 октября 2010

Я использую Alter Table

ALTER IGNORE TABLE jos_city ADD UNIQUE INDEX(`city`);
0 голосов
/ 24 августа 2010

В MySql, когда я ставлю что-то вроде

delete from A where IDA in (select IDA from A )

mySql сказал что-то вроде: «Вы не можете использовать одну и ту же таблицу в выбранной части операции удаления».

Мне просто нужно удалить несколько повторяющихся записей, и я добился успеха с такой программой .php

<?php
...
$res = hacer_sql("SELECT MIN(IDESTUDIANTE) as IDTODELETE 
FROM `estudiante` group by `LASTNAME`,`FIRSTNAME`,`CI`,`PHONE`
HAVING COUNT(*) > 1 )");
while ( $reg = mysql_fetch_assoc($res) ) {
   hacer_sql("delete from estudiante where IDESTUDIANTE = {$reg['IDTODELETE']}");
}
?>
0 голосов
/ 31 июля 2010

Если в вашей таблице есть PK (или вы легко можете указать его), вы можете указать любое количество столбцов в таблице, чтобы они были равны (чтобы квалифицировать как дубликат) с помощью следующего запроса (может быть немного запутанным смотря но работает):

DELETE FROM table WHERE pk_id IN(
   SELECT DISTINCT t3.pk_id FROM (
       SELECT t1.* FROM table AS t1 INNER JOIN (
           SELECT col1, col2, col3, col4, COUNT(*) FROM table
           GROUP BY col1, col2, col3, col4 HAVING COUNT(*)>1) AS t2
       ON t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3 AND
       t1.col4 = t2.col4)
   AS t3, (
       SELECT t1.* FROM table AS t1 INNER JOIN (
           SELECT col1, col2, col3, col4, COUNT(*) FROM table
           GROUP BY col1, col2, col3, col4 HAVING COUNT(*)>1) AS t2
       ON t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3 AND
       t1.col4 = t2.col4)
   AS t4
   WHERE t3.col1 = t4.col1 AND t3.pk_id > t4.pk_id

)

Это оставит первую запись, введенную в базу данных, удалив «новейшие» дубликаты. Если вы хотите сохранить последнюю запись, переключите> на <. </p>

0 голосов
/ 19 марта 2009

Вы можете использовать:

http://lenniedevilliers.blogspot.com/2008/10/weekly-code-find-duplicates-in-sql.html

чтобы получить дубликаты, а затем просто удалить их с помощью кода Ruby или SQL (я бы сделал это в коде SQL, но это зависит от вас: -)

0 голосов
/ 19 марта 2009

Мне пришлось сделать это недавно в Oracle , но шаги были бы такими же в MySQL. Было много данных, по крайней мере, по сравнению с тем, с чем я привык работать, поэтому мой процесс дедупликации был сравнительно тяжелым. Я включил это здесь на случай, если кто-то еще столкнется с подобной проблемой.

Мои дублированные записи имели разные идентификаторы, разные updated_at раз, возможно разные updated_by идентификаторы, но все остальные столбцы одинаковы. Я хотел сохранить самые последние обновления любого дублированного набора.

Для этого я использовал комбинацию логики Rails и SQL.

Шаг первый: запустить сценарий граблей, чтобы идентифицировать идентификаторы дубликатов записей, используя логику модели. Идентификаторы идут в текстовом файле.

Шаг второй: создать временную таблицу с одним столбцом, идентификаторы для удаления, загруженные из текстового файла.

Шаг третий: создайте еще одну временную таблицу со всеми записями, которые я собираюсь удалить (на всякий случай!).

CREATE TABLE temp_duplicate_models 
  AS (SELECT * FROM models 
  WHERE id IN (SELECT * FROM temp_duplicate_ids));

Шаг четвертый: фактическое удаление.

DELETE FROM models WHERE id IN (SELECT * FROM temp_duplicate_ids);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...