Мне нужно DELETE
дублировать строки для указанного SID наMySQL
таблице.
Как я могу сделать это с запросом SQL?
DELETE (DUPLICATED TITLES) FROM table WHERE SID = "1"
Как то так, но я не знаю как это сделать.
mysql
duplicates
Али Демирчи
источник
источник
Ответы:
это удаляет дубликаты на месте, не создавая новую таблицу
примечание: хорошо работает, только если индекс помещается в память
источник
ALTER IGNORE
.ALTER TABLE foo ENGINE MyISAM
обойти это, поменял двигатель обратно после.Предположим, у вас есть таблица
employee
со следующими столбцами:Чтобы удалить строки с дублирующимся
first_name
столбцом:источник
employee
против себя для одного совпадения индекса и одна>
проверка индекса будет медленным для больших таблиц. Разве не было бы лучше,SELECT MAX(ID) FROM t GROUP BY unique
а затемJOIN
точное совпадениеID
сMAX(ID)
?После удаления дубликатов для всех SID-ов, а не только одного.
С временной таблицей
Поскольку
temp_table
он только что создан, он не имеет индексов. Вам нужно будет воссоздать их после удаления дубликатов. Вы можете проверить, какие индексы у вас есть в таблице сSHOW INDEXES IN table
Без временной таблицы:
источник
SELECT * FROM table GROUP BY title, SID;
Все зависит от того, насколько хорошо вы знаете, что делаете.Удаление дублирующихся строк в MySQL на месте, (при условии, что у вас есть столбец метки времени для сортировки) пошаговое руководство:
Создайте таблицу и вставьте несколько строк:
Удалить дубликаты на месте:
Все готово, повторяющиеся строки удаляются, последняя отметка времени сохраняется.
Для тех из вас, у кого нет метки времени или уникальной колонки.
У вас нет
timestamp
или уникальный индексный столбец для сортировки? Вы живете в состоянии вырождения. Вам придется сделать дополнительные шаги, чтобы удалить дубликаты строк.создать таблицу пингвинов и добавить несколько строк
сделать клон первой таблицы и скопировать в нее.
Максимальный агрегат работает с новым индексом moo:
наблюдать и убирать
Что делает этот большой оператор удаления SQL?
Настольные пингвины с псевдонимом «a» оставляются соединенными с подмножеством настольных пингвинов, которое называется «b». Правая таблица 'b', которая является подмножеством, находит метку максимального времени [или max moo], сгруппированную по столбцам foo и bar. Это соответствует левой таблице «а». (foo, bar, baz) слева имеет каждую строку в таблице. Правое подмножество 'b' имеет (maxtimestamp, foo, bar), которое соответствует левому только тому, которое является макс.
Каждая строка, отличная от max, имеет значение maxtimestamp, равное NULL. Отфильтруйте эти NULL-строки, и у вас будет набор всех строк, сгруппированных по foo и bar, который не является последней базой меток времени. Удалить те.
Сделайте резервную копию таблицы, прежде чем запускать это.
Предотвратите повторение этой проблемы за этим столом:
Если вы заставили это сработать, и это потушило ваш «двойной ряд» огня. Отлично. Теперь определите новый составной уникальный ключ в вашей таблице (в этих двух столбцах), чтобы предотвратить добавление новых дубликатов.
Как и в случае с хорошей иммунной системой, плохие строки не должны быть допущены к таблице во время вставки. Позже все эти программы, добавляющие дубликаты, будут транслировать свои протесты, и когда вы их исправите, эта проблема больше никогда не возникнет.
источник
ID
столбец с автоинкрементом, то этоON
предложение должно соответствовать толькоID
столбцу, и ничего больше.После того, как я сам столкнулся с этой проблемой в огромной базе данных, я не был полностью впечатлен производительностью других ответов. Я хочу сохранить только последнюю двойную строку и удалить остальные.
В операторе с одним запросом, без временной таблицы, это работало лучше всего для меня,
Единственное предостережение в том, что я должен выполнить запрос несколько раз, но даже при этом я обнаружил, что он работает лучше для меня, чем другие варианты.
источник
Кажется, это всегда работает для меня:
Который сохраняет наименьший идентификатор для каждого из дупсов и остальных записей не дуплей.
Я также предпринял следующие действия, чтобы проблема удаления больше не возникала после удаления:
Другими словами, я создаю дубликат первой таблицы, добавляю уникальный индекс к полям, дубликаты которых я не хочу, и затем делаю тот,
Insert IGNORE
который имеет преимущество, заключающееся в том, что он не дает ошибок как обычноInsert
, при первой попытке добавления дубликат записи, основанный на двух полях, и скорее игнорирует любые такие записи.Перемещение fwd становится невозможным для создания дубликатов записей на основе этих двух полей.
источник
ORDER BY
в,SELECT
чтобы быть уверенным, какая запись на самом деле переходит наNoDupeTable
?ORDER by ID Asc
не повредит, поэтому я все же отредактирую свой ответ.Select Max(ID)
а затем,Order by Max(ID)
но все, что нужно сделать, это изменить порядок вставки. Для получения самого высокого идентификатора потребуется, по-моему, более сложное соединение выбора, поскольку независимо от того, как вы заказываете выше, вы будете получать значения полей из более низкого идентификатора.MAX(ID)
илиMIN(ID)
и имена столбцов, а не*
вSELECT FROM DupeTable
хотя, в противном случае вы просто получите один изID
случайных. Фактически, многие SQL и даже строгие требования MySQL требуют вызова статистической функции для каждого столбца, не указанного вGROUP BY
предложении.ID,First,Last,Notes
и записями,1,Bob,Smith,NULL
а2,Bob,Smith,Arrears
затем выполнение aSELECT *Max(ID), First,Last,Notes FROM DupeTable group by First,Last
вернуло бы одну и ту же запись, 1, за исключением другого идентификатора. Max (ID) вернется,2,Bob,Smith,NULL
а Min (ID) вернется1,Bob,Smith,NULL
. Я считаю, что для получения второй записи с "Задолженностью" в примечаниях требуется объединение.Следующие работы для всех таблиц
источник
Вот простой ответ:
источник
and a.id_field = b.id
LEFT JOIN
Кb
только нужно сравнитьb.id
=a.id_field
предполагаяfield_id
уникальную автоматическое приращение ID. такa.field_being_repeated = b.field_being_repeated
посторонний. (такжеb.id_field
не существует в этом запросе этоb.id
.Эта работа для меня, чтобы удалить старые записи:
Вы можете заменить min (e.id) на max (e.id), чтобы удалить новейшие записи.
источник
источник
Я нахожу решение Вернера выше наиболее удобным, поскольку оно работает независимо от наличия первичного ключа, не связывается с таблицами, использует простой SQL-файл, ориентированный на будущее, очень понятно.
Как я сказал в своем комментарии, это решение не было должным образом объяснено все же. Так что это мое, основываясь на этом.
1) добавить новый логический столбец
2) добавить ограничение на дублированные столбцы и новый столбец
3) установите для логического столбца значение true. Это будет успешным только в одной из дублированных строк из-за нового ограничения
4) удалить строки, которые не были помечены как tokeep
5) опустить добавленный столбец
Я предлагаю, чтобы вы сохранили ограничение, которое вы добавили, чтобы новые дубликаты были предотвращены в будущем.
источник
Эта процедура удалит все дубликаты (включая кратные) в таблице, сохраняя последний дубликат. Это расширение получения последней записи в каждой группе.
Надеюсь, это кому-нибудь пригодится.
источник
Еще один простой способ ... с помощью UPDATE IGNORE:
Вы должны использовать индекс для одного или нескольких столбцов (тип индекса). Создайте новый столбец временных ссылок (не является частью индекса). В этом столбце вы отмечаете уникальность, обновляя его с помощью условия игнорирования. Шаг за шагом:
Добавьте временный справочный столбец, чтобы отметить уникальность:
=> это добавит столбец к вашей таблице.
Обновите таблицу, попробуйте пометить все как уникальные, но игнорируйте возможные ошибки из-за дублирования ключа (записи будут пропущены):
=> вы обнаружите, что ваши повторяющиеся записи не будут помечены как уникальные = 'Да', другими словами, только одна из каждого набора повторяющихся записей будет помечена как уникальная.
Удалите все, что не уникально:
=> Это удалит все дубликаты записей.
Оставьте столбец ...
источник
unique
столбец ДОЛЖЕН быть добавлен к уникальному ограничению вместе со столбцами, которые в настоящее время дублируются, иначе все это не будет работать, потому что SETunique
= 'Yes' никогда не завершится ошибкой.unique
в виду, что это ключевое слово mysql. Таким образом, он должен иметь галочки (как уже правильно отображается). Использование другого слова для столбца может быть более удобным.Удаление дубликатов в таблицах MySQL является распространенной проблемой, которая обычно связана с конкретными потребностями. В случае, если кто-то заинтересован, здесь ( Удалите повторяющиеся строки в MySQL ) я объясняю, как использовать временную таблицу для надежного и быстрого удаления дубликатов MySQL, также пригодных для обработки больших источников данных (с примерами для разных вариантов использования).
Али , в вашем случае вы можете запустить что-то вроде этого:
источник
источник
Ответ Love @ eric, но, кажется, он не работает, если у вас действительно большой стол (я получаю,
The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay
когда пытаюсь его запустить). Поэтому я ограничил запрос на соединение только рассмотрением дублирующихся строк и в итоге получил:Предложение WHERE в этом случае позволяет MySQL игнорировать любую строку, у которой нет дубликата, а также игнорирует, если это первый экземпляр дубликата, поэтому будут игнорироваться только последующие дубликаты. Перейдите
MIN(baz)
наMAX(baz)
сохранение последнего экземпляра вместо первого.источник
Это работает для больших таблиц:
Удалить самое старое изменение
max(id)
наmin(id)
источник
Это здесь сделает столбец
column_name
первичным ключом, а тем временем проигнорирует все ошибки. Таким образом, будут удалены строки с повторяющимся значением дляcolumn_name
.источник
Я думаю, что это сработает, в основном скопировав таблицу и очистив ее, а затем вставив в нее только отдельные значения, но, пожалуйста, дважды проверьте ее, прежде чем делать это для больших объемов данных.
Создает точную копию вашего стола
Опорожняет ваш оригинальный стол
Копирует все отдельные значения из скопированной таблицы обратно в исходную таблицу
Удаляет вашу временную таблицу.
Вам нужно сгруппировать по всем полям, которые вы хотите сохранить отдельно.
источник
источник
вот как я обычно устраняю дубликаты
источник
Вы можете просто использовать предложение DISTINCT, чтобы выбрать «очищенный» список (и вот очень простой пример того, как это сделать).
источник
DISTINCT
вас, вы потеряете любую информацию о дубликатах, которые у вас могли быть. Можете ли вы показать способ удаления дубликатов, используя его?Может ли это сработать, если вы посчитаете их, а затем добавите ограничение к вашему запросу на удаление, оставив только один?
Например, если у вас есть два или более, напишите ваш запрос следующим образом:
источник
Существует всего несколько основных шагов при удалении дублирующихся данных из вашей таблицы:
Вот полный учебник: https://blog.teamsql.io/deleting-duplicate-data-3541485b3473
источник