Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL remover registros duplicados


Às vezes, você pode precisar remover registros duplicados ou excluir linhas duplicadas no MySQL. Existem basicamente 3 maneiras de excluir registros duplicados no MySQL. Veja como remover registros duplicados no MySQL.


Remoção de registros duplicados do MySQL


Aqui estão as etapas para remover registros duplicados no MySQL. Digamos que você tenha a seguinte tabela dup_orders(id, amount) com registros duplicados.
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 |
+------+--------+



Bônus de leitura:Como obter registros duplicados no MySQL


Como excluir linhas duplicadas no MySQL


Vejamos cada uma das 3 maneiras de excluir registros duplicados no MySQL.


1. Remova registros duplicados usando a tabela intermediária


Este método envolve 3 etapas. Primeiro, selecione as linhas sem duplicatas, de dup_orders tabela e insira-os em outra tabela. Aqui está a sintaxe para isso.
CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];

Aqui está nossa consulta para selecionar linhas distintas de dup_orders em outra tabela.
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 |
+------+--------+

A consulta acima remove as linhas que completam duplicatas, ou seja, valores duplicados para todas as colunas.



Se você deseja remover linhas com valores duplicados para apenas uma ou mais, mas não todas as colunas, você pode usar uma cláusula GROUP BY na consulta acima. Por exemplo, se você quiser apenas linhas com valores de coluna de ID duplicados em sua tabela, use a consulta a seguir.
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 |
+------+--------+

Depois de criar a tabela intermediária, elimine a tabela original.
mysql> drop table dup_orders;



Por fim, renomeie a tabela intermediária para a tabela original.
mysql> alter table dup_orders_copy rename to dup_orders;

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    350 |
+------+--------+



Bônus de leitura:MySQL adiciona restrição única


2. Remova linhas duplicadas usando INNER JOIN


Você também pode remover linhas duplicadas usando a combinação de instruções DELETE e INNER JOIN. No entanto, neste caso, sua tabela precisa ter pelo menos uma coluna exclusiva (por exemplo, chave primária). Digamos que você tenha os seguintes dup_orders tabela com quantidade duplicada valores, mas id exclusivo valores.
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 |
+------+--------+

Você pode unir a tabela acima com ela mesma usando um INNER JOIN e excluir linhas duplicadas usando a consulta a seguir.
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 |
+------+--------+

A consulta acima reterá o ID mais alto da linha para cada linha duplicada. Se você quiser manter a linha com o ID mais baixo, use a consulta a seguir.
mysql> DELETE t1 FROM dup_orders t1
       INNER JOIN dup_orders t2
       WHERE
           t1.id >> t2.id 
           AND t1.amount = t2.amount;



Bônus de leitura:MySQL Renomear coluna


3. Remova registros duplicados usando ROW_NUMBER()


Você também pode remover registros duplicados da tabela usando a função ROW_NUMBER(), disponível desde 8.0.2. Aqui está a consulta SQL para obter números de linha de linhas duplicadas
SELECT *. ROW_NUMBER () Over (PARTITION BY [column] 
ORDER BY [column]) as [row_number_name];

Aqui está a consulta para obter o número da linha para a tabela dup_orders
SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) 
as row_number from dup_orders;



Usaremos isso como uma subconsulta em nossa consulta SQL para excluir linhas duplicadas, conforme mostrado abaixo
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
)

Espero que agora você possa remover facilmente registros duplicados no MySQL.



O Ubiq facilita a visualização de dados em minutos e o monitoramento em painéis em tempo real. Experimente hoje!