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