English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Manejo de dados duplicados MySQL

Alguns bancos de dados MySQL podem conter registros duplicados, em algumas situações permitimos a existência de dados duplicados, mas às vezes também precisamos excluir esses dados duplicados.

Nesta seção, vamos apresentar como evitar a ocorrência de dados duplicados em tabelas de dados e como excluir dados duplicados da tabela de dados.

para evitar a ocorrência de dados duplicados na tabela

Você pode configurar o campo específico em uma tabela do MySQL PRIMARY KEY (chave primária) ou UNIQUE (único) Índice para garantir a unicidade dos dados.

Vamos tentar um exemplo: na tabela a seguir, não há índice nem chave primária, então a tabela permite a existência de vários registros duplicados.

CREATE TABLE person_tbl
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);

Se você quiser configurar os dados first_name, last_name no campo da tabela para não serem duplicados, você pode configurar o modo de chave primária dupla para configurar a unicidade dos dados Se você configurar uma chave primária dupla, o valor padrão dessa chave não pode ser NULL, pode ser configurado como NOT NULL. Veja o exemplo a seguir:

CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10,
   PRIMARY KEY (last_name, first_name)
);

Se configurarmos um índice único, a instrução SQL falhará ao inserir dados duplicados e lançará um erro.

A diferença entre INSERT IGNORE INTO e INSERT INTO é que o INSERT IGNORE INTO ignora os dados existentes no banco de dados, se o banco de dados não tiver dados, insere novos dados, se houver dados, pula essa linha de dados. Dessa forma, pode-se manter os dados existentes no banco de dados e alcançar o objetivo de inserir dados no espaço vazio.

O exemplo a seguir usou INSERT IGNORE INTO, ao executar, não haverá erro e nem dados repetidos serão inseridos na tabela de dados:

mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES('Jay', 'Thomas');
Query OK 1 linha afetada (0.00 seg)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES('Jay', 'Thomas');
Query OK, 0 linhas afetadas (0.00 seg)

INSERT IGNORE INTO ao inserir dados, após configurar a unicidade do registro, se inserir dados repetidos, não retornará erro, apenas uma mensagem de aviso. Enquanto o REPLACE INTO, se existir um registro primário ou único idêntico, será removido primeiro antes de inserir um novo registro.

Outra maneira de definir a unicidade dos dados é adicionar um índice UNIQUE, conforme mostrado a seguir:

CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10,
   UNIQUE (last_name, first_name)
);

Contar dados repetidos

A seguir, vamos contar o número de registros repetidos de first_name e last_name na tabela:

mysql> SELECT COUNT(*) como repetitions, last_name, first_name
    -FROM person_tbl
    -> GROUP BY last_name, first_name
    -> HAVING repetitions > 1;

A consulta acima retornará o número de registros repetidos na tabela person_tbl. Geralmente, para consultar valores repetidos, execute as seguintes operações:

  • determine qual coluna pode conter valores repetidos.

  • No lista de seleção de colunas, use COUNT(*) das colunas listadas.

  • nas colunas listadas na cláusula GROUP BY.

  • A cláusula HAVING define repetições maiores que1.

Filtrar dados repetidos

Se precisar ler dados não repetidos, você pode usar a palavra-chave DISTINCT na cláusula SELECT para filtrar dados repetidos.

mysql> SELECT DISTINCT last_name, first_name
    -> FROM person_tbl;

Você também pode usar GROUP BY para ler dados não repetidos na tabela de dados:

mysql> SELECT last_name, first_name
    -FROM person_tbl
    -GROUP BY (last_name, first_name);

Excluir dados duplicados

Se você quiser excluir dados duplicados da tabela de dados, você pode usar a seguinte sentença SQL:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

Claro, você também pode adicionar INDEX (índice) e PRIMAY KEY (chave primária) dessa maneira simples para excluir registros duplicados na tabela de dados. O método é o seguinte:

mysql> ALTER IGNORE TABLE person_tbl
    -ADD PRIMARY KEY (last_name, first_name);