Как MySQL удаляет повторяющиеся строки

How Mysql Delete Duplicate Rows



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

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







Прежде чем продолжить, мы предполагаем:



  1. У вас установлен и запущен MySQL в вашей системе
  2. У вас есть root-доступ к базе данных.
  3. У вас есть доступ к базе данных для экспериментов или тестирования

ПРИМЕЧАНИЕ : Если вам нужен образец базы данных, чтобы опробовать концепции, представленные в этом руководстве, обратите внимание на базу данных Sakila или загрузите копию базы данных, использованную в этом руководстве.



Ресурсы представлены ниже:





Основное использование

Прежде чем мы начнем, мы намеренно создадим таблицу, содержащую повторяющиеся значения для целей тестирования. SQL-запросы для выполнения этого действия приведены ниже:

ИСПОЛЬЗОВАТЬ Мир;
УРОНИТЬ СТОЛ ЕСЛИ СУЩЕСТВУЮТ пользователи;
СОЗДАЙТЕ СТОЛ пользователи(я бы INT ОСНОВНОЙ КЛЮЧ НЕТ НУЛЕВОЙ АВТОМАТИЧЕСКОЕ ПРИРАЩЕНИЕ ,имя пользователя VARCHAR (10) НЕТ НУЛЕВОЙ ,полное имя VARCHAR (двадцать),Эл. адрес VARCHAR (255) НЕТ НУЛЕВОЙ );
ВСТАВЛЯТЬ В пользователи(имя пользователя,полное имя,Эл. адрес) ЦЕННОСТИ
('Дева', 'Клод М. Мори', '[электронная почта защищена]'),
('Нажмите', 'Тиффани Дж. Бейли', '[электронная почта защищена]'),
('ракета', 'Кристофер С. Пэйтон', '[электронная почта защищена]'),
('темная материя', 'Патрисия Дж. Фокс', '[электронная почта защищена]'),
('тема', 'Фэй Х. Хартли', '[электронная почта защищена]'),
('темная материя', 'Патрисия Дж. Фокс', '[электронная почта защищена]'),
('ракета', 'Кристофер С. Пэйтон', '[электронная почта защищена]'),
('артемида', 'Уэсли С. Диллард', '[электронная почта защищена]');

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



Теперь, если мы получим все данные внутри таблицы и в порядке по имени пользователя, мы увидим дубликаты, которые у нас есть, как показано:

MySQL> использовать Мир;
База данных измененный
MySQL> ВЫБРАТЬ * ИЗ пользователи СОРТИРОВАТЬ ПО имя пользователя;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|я бы|имя пользователя|полное имя|Эл. адрес|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |артемида|Уэсли С. Диллард|[электронная почта защищена]|
| 4 |темная материя|Патрисия Дж. Фокс|[электронная почта защищена]|
| 6 |темная материя|Патрисия Дж. Фокс|[электронная почта защищена]|
| 2 |Нажмите|Тиффани Дж. Бейли|[электронная почта защищена]|
| 5 |тема|Фэй Х. Хартли|[электронная почта защищена]|
| 3 |ракета|Кристофер С. Пэйтон|[электронная почта защищена]|
| 7 |ракета|Кристофер С. Пэйтон|[электронная почта защищена]|
| 1 |Дева|Клод М. Мори|[электронная почта защищена]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

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

Давайте теперь узнаем, как мы можем удалить эти значения.

# 1 - УДАЛИТЬ СОЕДИНЕНИЕ

Один из способов удалить повторяющиеся строки в базе данных - использовать инструкцию MySQL DELETE JOIN. Однако запрос использует идентификаторы для удаления повторяющихся значений.

Например, чтобы удалить повторяющиеся значения в приведенной выше таблице пользователей, мы можем ввести:

УДАЛЯТЬ Таблица 1 ИЗ таблица пользователей1 ВНУТРЕННИЙ ПРИСОЕДИНИТЬСЯ таблица пользователей2 КУДА table1.id<table2.id А ТАКЖЕ table1.emailзнак равноtable2.email;

Выполнив вышеуказанный запрос, вы удалите повторяющиеся значения, как показано в выходных данных ниже:

MySQL> УДАЛЯТЬ Таблица 1 ИЗ таблица пользователей1 ВНУТРЕННИЙ ПРИСОЕДИНИТЬСЯ таблица пользователей2 КУДА table1.id<table2.id А ТАКЖЕ table1.emailзнак равноtable2.email;
Запрос ОК, 2затронутые строки(0,01сек)

MySQL> ВЫБРАТЬ * ИЗ пользователи СОРТИРОВАТЬ ПО имя пользователя;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|я бы|имя пользователя|полное имя|Эл. адрес|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |артемида|Уэсли С. Диллард|[электронная почта защищена]|
| 6 |темная материя|Патрисия Дж. Фокс|[электронная почта защищена]|
| 2 |Нажмите|Тиффани Дж. Бейли|[электронная почта защищена]|
| 5 |тема|Фэй Х. Хартли|[электронная почта защищена]|
| 7 |ракета|Кристофер С. Пэйтон|[электронная почта защищена]|
| 1 |Дева|Клод М. Мори|[электронная почта защищена]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

# 2 - Функция Row_Number ()

Второй метод, который мы можем реализовать, - использовать функцию MySQL row_number (). Эта функция поддерживается в MySQL версии 8 и выше.

Он работает путем присвоения последовательного значения int каждой строке, причем строки, содержащие повторяющиеся значения, получают значение выше 1.

Чтобы узнать больше об этой функции, используйте приведенный ниже ресурс:

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

Рассмотрим приведенный ниже запрос, который возвращает идентификатор строк с повторяющимися значениями:

ВЫБРАТЬ я бы ИЗ ( ВЫБРАТЬ я бы,ROW_NUMBER()НАД( РАЗДЕЛЕНИЕ ПО имени пользователя СОРТИРОВАТЬ ПО имя пользователя) В КАЧЕСТВЕ row_var ИЗ пользователи)t1 КУДА row_var> 1;

После выполнения вышеуказанного запроса вы должны получить список идентификаторов, как показано в выходных данных ниже:

+ ---- +
|я бы|
+ ---- +
| 6 |
| 7 |
+ ---- +
2ряды в установленный (0,01сек)

Если вы хотите удалить значения, просто замените оператор SELECT оператором DELETE, как показано ниже:

УДАЛЯТЬ ИЗ пользователи КУДА я бы В ( ВЫБРАТЬ я бы ИЗ ( ВЫБРАТЬ я бы,ROW_NUMBER()НАД( РАЗДЕЛЕНИЕ ПО имени пользователя СОРТИРОВАТЬ ПО имя пользователя) В КАЧЕСТВЕ row_var ИЗ пользователи)t1 КУДА row_var> 1);

Наконец, вы можете убедиться, что повторяющиеся значения удалены, используя оператор SELECT.

MySQL> ВЫБРАТЬ * из пользователи СОРТИРОВАТЬ ПО имя пользователя;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|я бы|имя пользователя|полное имя|Эл. адрес|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |артемида|Уэсли С. Диллард|[электронная почта защищена]|
| 4 |темная материя|Патрисия Дж. Фокс|[электронная почта защищена]|
| 2 |Нажмите|Тиффани Дж. Бейли|[электронная почта защищена]|
| 5 |тема|Фэй Х. Хартли|[электронная почта защищена]|
| 3 |ракета|Кристофер С. Пэйтон|[электронная почта защищена]|
| 1 |Дева|Клод М. Мори|[электронная почта защищена]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Заключение

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