Restrição UNIQUE do MySQL Explicada: Como Evitar Dados Duplicados (Com Exemplos)

1. Introdução

No design de bancos de dados, manter a unicidade dos dados é extremamente importante. Se o mesmo dado for registrado várias vezes, isso pode causar falhas no sistema e levar à inconsistência dos dados. O MySQL oferece um recurso chamado restrição UNIQUE para prevenir esse problema.

Por exemplo, quando usuários se registram em um serviço web, se o mesmo endereço de e‑mail for cadastrado múltiplas vezes, podem ocorrer erros de login. Para evitar essas situações, você pode usar a restrição UNIQUE para garantir que os valores em uma coluna específica permaneçam únicos.

Neste artigo, explicamos claramente a restrição UNIQUE do MySQL — desde o uso básico até exemplos avançados. Também abordamos considerações importantes e perguntas frequentes para que você possa aplicar esse conhecimento imediatamente em projetos reais.

2. Conceitos Básicos da Restrição UNIQUE

O que é uma restrição UNIQUE?

A restrição UNIQUE no MySQL impede valores duplicados em uma coluna específica ou em uma combinação de colunas. Ao aplicar essa restrição, você garante que o mesmo valor não possa ser inserido mais de uma vez.

Diferença entre UNIQUE e PRIMARY KEY

O MySQL também fornece a restrição PRIMARY KEY, que difere da restrição UNIQUE em vários aspectos.

  1. PRIMARY KEY é sempre NOT NULL PRIMARY KEY não apenas garante unicidade, mas também proíbe valores NULL. Em contraste, uma restrição UNIQUE permite valores NULL.
  2. Apenas uma PRIMARY KEY por tabela Uma tabela pode ter apenas uma PRIMARY KEY, enquanto múltiplas restrições UNIQUE podem ser definidas na mesma tabela.

Casos de Uso Comuns para a restrição UNIQUE

A restrição UNIQUE é comumente usada nos seguintes cenários:

  • Endereços de e‑mail ou nomes de usuário Quando cada usuário deve ter um e‑mail ou nome de usuário único.
  • Números de produto ou números de pedido Quando IDs de produto ou IDs de pedido não podem ser duplicados.
  • Condições compostas Quando é necessário garantir unicidade entre duas ou mais colunas.

3. Como Usar a Restrição UNIQUE

Defina-a ao Criar uma Tabela

No MySQL, você pode definir uma restrição UNIQUE diretamente ao criar uma nova tabela.

Exemplo: Aplicar a uma Única Coluna

CREATE TABLE users (
    id INT AUTO_INCREMENT,
    email VARCHAR(255) UNIQUE,
    PRIMARY KEY (id)
);

Neste exemplo, a coluna email tem uma restrição UNIQUE aplicada. Tentar inserir o mesmo endereço de e‑mail várias vezes resultará em um erro.

Exemplo: Múltiplas Colunas (Restrição UNIQUE Composta)

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT,
    product_id INT,
    user_id INT,
    UNIQUE (product_id, user_id),
    PRIMARY KEY (order_id)
);

Este exemplo garante que a combinação de product_id e user_id seja única. É útil quando se deseja impedir que o mesmo usuário faça o mesmo pedido de produto várias vezes.

Adicionar uma Restrição a uma Tabela Existente

Você também pode adicionar uma restrição UNIQUE a uma tabela já existente.

Exemplo: Adicionar uma Restrição a uma Única Coluna

ALTER TABLE users
ADD CONSTRAINT unique_email UNIQUE (email);

Exemplo: Adicionar uma Restrição Composta

ALTER TABLE orders
ADD CONSTRAINT unique_product_user UNIQUE (product_id, user_id);

Como Remover uma Restrição

Para remover uma restrição existente, use as instruções SQL a seguir:

Remover uma Restrição de Única Coluna

ALTER TABLE users
DROP INDEX unique_email;

Remover uma Restrição Composta

ALTER TABLE orders
DROP INDEX unique_product_user;

4. Considerações Importantes para a Restrição UNIQUE

Tratamento de Valores NULL

Ao aplicar uma restrição UNIQUE a uma coluna que permite valores NULL, regras especiais se aplicam. O MySQL não gera erro mesmo que existam múltiplos valores NULL na mesma coluna. Isso ocorre porque o MySQL trata valores NULL como “não iguais a nada”.

Exemplo:

CREATE TABLE test_table (
    id INT AUTO_INCREMENT,
    column1 INT UNIQUE,
    PRIMARY KEY (id)
);

Agora, insira os seguintes dados:

INSERT INTO test_table (column1) VALUES (NULL);
INSERT INTO test_table (column1) VALUES (NULL);

Nenhum erro ocorrerá. Isso ocorre porque os valores NULL são considerados diferentes de qualquer outro valor, incluindo outro NULL.

Impacto de Desempenho

Quando você define uma restrição UNIQUE, o MySQL cria automaticamente um índice internamente. Esse índice ajuda na pesquisa e ordenação de dados, mas pode reduzir o desempenho ao inserir ou atualizar grandes volumes de dados.

  • Nota 1: Ao inserir grandes quantidades de dados de uma só vez, a restrição UNIQUE deve ser verificada, o que pode desacelerar o processamento.
  • Nota 2: Para manter o desempenho ideal, considere reconstruir os índices antes que o volume de dados se torne muito grande.

Tratamento de Erros Quando Ocorram

Se ocorrer uma violação da restrição UNIQUE, o MySQL retorna o código de erro “1062”. Esse erro é disparado ao tentar inserir dados duplicados.

Exemplo:

INSERT INTO users (email) VALUES ('test@example.com');
INSERT INTO users (email) VALUES ('test@example.com');

A segunda inserção resultará em um erro.

Soluções:

  1. Verifique se os dados já existem antes de inserir.
    SELECT COUNT(*) FROM users WHERE email = 'test@example.com';
    
  1. Use ON DUPLICATE KEY UPDATE para atualizar os dados quando um duplicado for detectado.
    INSERT INTO users (email) VALUES ('test@example.com')
    ON DUPLICATE KEY UPDATE email = 'test@example.com';
    

5. Perguntas Frequentes (FAQ)

Q1: Qual é a diferença entre UNIQUE e PRIMARY KEY?

PRIMARY KEY garante unicidade e não permite valores NULL. Apenas um PRIMARY KEY pode ser definido por tabela. Em contraste, restrições UNIQUE podem ser definidas em múltiplas colunas e permitem valores NULL.

Q2: O que acontece se você aplicar uma restrição UNIQUE a uma coluna que permite valores NULL?

Vários valores NULL podem ser inseridos. Isso ocorre porque o MySQL trata valores NULL como incomparáveis.

Q3: Quando deve ser usada uma restrição UNIQUE composta?

É usada quando você deseja garantir unicidade em uma combinação de colunas, como assegurar que a combinação de product_id e user_id seja única. Isso ajuda a impedir que um usuário faça o mesmo pedido de produto várias vezes.

Q4: Você pode adicionar uma restrição UNIQUE se já existirem dados duplicados?

Não. Se já existirem dados duplicados, você não pode adicionar uma restrição UNIQUE. Primeiro, é necessário remover ou corrigir os registros duplicados antes de adicionar a restrição.

Q5: Remover uma restrição UNIQUE também remove seu índice?

Sim. Quando você remove uma restrição UNIQUE, o índice associado também é removido.

6. Resumo

A restrição UNIQUE do MySQL é um recurso extremamente útil para garantir a unicidade dos dados. Ao compreender suas diferenças em relação ao PRIMARY KEY e como os valores NULL são tratados, você pode melhorar significativamente a qualidade do design do seu banco de dados.

O uso adequado da restrição UNIQUE é especialmente importante para manter a integridade do banco de dados. Utilize os métodos e considerações explicados neste artigo para aprimorar o design e a implementação do seu banco de dados.

No próximo artigo, exploraremos como usar índices de forma eficaz no MySQL e discutiremos outras restrições, como FOREIGN KEY e CHECK. Fique ligado!