Понякога може да се наложи да премахнете дублиращи се записи или да изтриете дублиращи се редове в MySQL. Има основно 3 начина за изтриване на дублиращи се записи в MySQL. Ето как да премахнете дублиращи се записи в MySQL.
MySQL Премахване на дублиращи се записи
Ето стъпките за премахване на дублиращи се записи в MySQL. Да приемем, че имате следната таблица dup_orders(id, amount) с дублиращи се записи.
mysql> create table dup_orders(id int, amount int); mysql> insert into dup_orders(id,amount) values(1, 100),(1,250),(2,350),(2,350); mysql> select * from dup_orders; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 1 | 250 | | 2 | 350 | | 2 | 350 | +------+--------+
Бонус за четене:Как да получите дублирани записи в MySQL
Как да изтрия дублиращи се редове в MySQL
Нека разгледаме всеки от 3-те начина за изтриване на дублиращи се записи в MySQL.
1. Премахнете дублиращи се записи с помощта на междинна таблица
Този метод включва 3 стъпки. Първо изберете редове без дубликати от dup_orders таблица и ги поставете в друга таблица. Ето синтаксиса за него.
CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];
Ето нашата заявка за избор на отделни редове от dup_orders в друга таблица.
mysql> CREATE TABLE dup_orders_copy SELECT DISTINCT id,amount FROM dup_orders; mysql> select * from dup_orders_copy; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 1 | 250 | | 2 | 350 | +------+--------+
Горната заявка премахва редове, които завършват дублирани, тоест дублиращи се стойности за всички колони.
Ако искате да премахнете редове с дублиращи се стойности само за една или повече, но не за всички колони, можете да използвате клауза GROUP BY в горната заявка. Например, ако искате само редове с дублиращи се стойности на колона с идентификатор във вашата таблица, използвайте следната заявка.
mysql> CREATE TABLE dup_orders_copy SELECT id,amount FROM dup_orders group by id; mysql> select * from dup_orders_copy; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 350 | +------+--------+
След като създадете междинната таблица, пуснете оригиналната таблица.
mysql> drop table dup_orders;
Накрая преименувайте междинната таблица в оригиналната.
mysql> alter table dup_orders_copy rename to dup_orders; mysql> select * from dup_orders; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 350 | +------+--------+
Бонус четене:MySQL Добавяне на уникална константа
2. Премахнете дублиращи се редове с помощта на INNER JOIN
Можете също да премахнете дублиращи се редове, като използвате комбинация от изрази DELETE и INNER JOIN. В този случай обаче вашата таблица трябва да има поне една уникална колона (напр. първичен ключ). Да приемем, че имате следните dup_orders таблица с дублирана сума стойности, но уникален идентификатор стойности.
mysql> insert into dup_orders(id,amount) values(1, 100),(2,250),(3,350),(4,350); mysql> select * from dup_orders; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 250 | | 3 | 350 | | 4 | 350 | +------+--------+
Можете да присъедините горната таблица със себе си, като използвате INNER JOIN и да изтриете дублиращи се редове, като използвате следната заявка.
mysql> DELETE t1 FROM dup_orders t1 INNER JOIN dup_orders t2 WHERE t1.id < t2.id AND t1.amount = t2.amount; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 250 | | 4 | 350 | +------+--------+
Горната заявка ще запази най-високия идентификатор на ред за всеки дублиран ред. Ако искате да запазите реда с най-нисък идентификатор, използвайте следната заявка.
mysql> DELETE t1 FROM dup_orders t1 INNER JOIN dup_orders t2 WHERE t1.id >> t2.id AND t1.amount = t2.amount;
Бонус четене:MySQL Преименуване на колона
3. Премахнете дублиращи се записи с помощта на ROW_NUMBER()
Можете също да премахнете дублиращи се записи от таблицата с помощта на функцията ROW_NUMBER(), налична от 8.0.2. Ето SQL заявката за получаване на номера на редове на дублиращи се редове
SELECT *. ROW_NUMBER () Over (PARTITION BY [column] ORDER BY [column]) as [row_number_name];
Ето заявката за получаване на номер на ред за таблица dup_orders
SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number from dup_orders;
Ще използваме това като подзаявка в нашата SQL заявка за изтриване на дублиращи се редове, както е показано по-долу
DELETE FROM dup_orders WHERE id IN ( SELECT id FROM ( SELECT id, ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number from dup_orders ) t WHERE row_number > 1 )
Надяваме се, че сега можете лесно да премахнете дублиращи се записи в MySQL.
Ubiq улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!