MySQL: Uma explicação detalhada sobre as restrições do…

Última atualização: 2026-08-26

As restrições são as guardiãs da integridade dos dados — elas impedem que dados incorretos entrem no banco de dados.

Esta aula oferece uma visão geral sistemática de todos os tipos de restrições e de como gerenciá-las.

100%
graph TB
    A[MySQL Constraints] --> B[PRIMARY KEY<br/>Primary Key Constraint]
    A --> C[FOREIGN KEY<br/>Foreign Key Constraints]
    A --> D[UNIQUE<br/>Unique Constraint]
    A --> E[NOT NULL<br/>Non-empty constraint]
    A --> F[CHECK<br/>Check Constraints]
    C --> C1[CASCADE]
    C --> C2[SET NULL]
    C --> C3[RESTRICT]

1. O que você vai aprender


2. Uma história real

(1) Desafio: dados incorretos estão por toda parte

Seis meses após a entrada em operação do sistema de pedidos, a qualidade dos dados era alarmante: havia pedidos com valores negativos, “pedidos fantasmas” sem clientes associados e um único nome de usuário usado para registrar cinco contas. A equipe de desenvolvimento tentou implementar a validação na camada de aplicação, mas, com o código do front-end e do back-end espalhados por diferentes partes do sistema, sempre havia brechas. Durante uma campanha promocional, um hacker contornou a validação do front-end e enviou um pedido com valor negativo, resultando em prejuízos financeiros diretos.

(2) Métodos para a resolução de problemas com restrições

Garantia da integridade dos dados no nível do banco de dados — a CHAVE PRIMÁRIA garante a exclusividade, a CHAVE ESTRANGEIRA garante as relações, a CHECK garante intervalos válidos e a UNIQUE garante que não haja duplicatas.

Dimensão Validação no nível da aplicação Restrições do banco de dados
Escopo de proteção Apenas este aplicativo Todas as fontes de conexão
Possibilidade de contorno O front-end/API pode ser contornado Não pode ser contornado
Custos de manutenção Espalhados por vários locais Centralizados nas definições das tabelas
Segurança de dados Média Máxima

3. Visão geral das cinco restrições

Restrição Função Permite NULL Permite duplicatas
CHAVE PRIMÁRIA Identifica cada linha de forma exclusiva
CHAVE ESTRANGEIRA Vínculos com outras tabelas
ÚNICO Os valores não podem ser duplicados
NOT NULL Não pode ser NULL
VERIFICAR Atende aos critérios

4. CHAVE PRIMÁRIA

▶ Exemplo: Restrição de chave primária

SQL
-- Single-column primary key
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50)
);

-- Composite Primary Key
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);
▶ Experimente

5. CHAVE ESTRANGEIRA

▶ Exemplo: Chaves estrangeiras e cascata

SQL
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    amount DECIMAL(10,2),
    FOREIGN KEY (customer_id) REFERENCES customers(id)
        ON DELETE CASCADE      -- Cascade order deletions when deleting a customer
        ON UPDATE CASCADE      -- Cascade update when customer ID changes
);

-- Cascade Options
-- CASCADE: Delete Synchronously/Update
-- SET NULL: Set as NULL
-- RESTRICT: Operation Rejected(Default)
-- NO ACTION: Same as RESTRICT
▶ Experimente

6. Restrição UNIQUE

▶ Exemplo: Restrição de exclusividade

SQL
-- Single-column, unique
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,
    username VARCHAR(50) UNIQUE
);

-- Composite Unique
CREATE TABLE user_roles (
    user_id INT,
    role_id INT,
    UNIQUE (user_id, role_id)
);
▶ Experimente

7. Restrição NOT NULL

▶ Exemplo: Restrição “Not-Null”

SQL
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    description TEXT  -- Allow NULL
);
▶ Experimente

8. Restrições CHECK (8.0+)

▶ Exemplo: Restrição CHECK

SQL
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age INT CHECK (age >= 18 AND age <= 65),
    salary DECIMAL(10,2) CHECK (salary > 0),
    email VARCHAR(100) CHECK (email LIKE '%@%.%')
);

-- Add CHECK Constraints
ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 18);

-- Delete CHECK Constraints
ALTER TABLE employees DROP CHECK chk_age;
▶ Experimente

9. Gerenciamento de restrições

▶ Exemplo: Adicionar/remover restrições

SQL
-- Add a Primary Key
ALTER TABLE users ADD PRIMARY KEY (id);

-- Add a Foreign Key
ALTER TABLE orders ADD CONSTRAINT fk_customer 
FOREIGN KEY (customer_id) REFERENCES customers(id);

-- Add a unique constraint
ALTER TABLE users ADD UNIQUE (email);

-- Delete Foreign Key
ALTER TABLE orders DROP FOREIGN KEY fk_customer;

-- Delete the unique constraint
ALTER TABLE users DROP INDEX email;
▶ Experimente

❓ Perguntas Frequentes

P: As chaves estrangeiras afetam o desempenho? R: Sim, até certo ponto (devido às verificações de restrições durante as gravações), mas elas garantem a integridade dos dados. Em cenários de alta concorrência, as verificações podem ser realizadas na camada de aplicação.

P: Qual é a relação entre NULL e UNIQUE? R: UNIQUE permite vários valores NULL (no MySQL, NULL != NULL).

P: É possível usar funções em restrições CHECK? R: O MySQL 8.0 e versões posteriores suportam o uso de expressões em restrições CHECK, mas não suportam subconsultas.

P: As restrições CHECK são válidas na versão 5.7? R: Não. O MySQL 5.7 aceita as restrições CHECK apenas do ponto de vista sintático, mas não as aplica; a aplicação dessas restrições só ocorre a partir da versão 8.0.16 ou posterior.

P: Os dados continuam lá após a exclusão de uma chave estrangeira? R: Sim. A exclusão de uma chave estrangeira remove apenas a restrição; não exclui nenhum dado.


📖 Resumo


📝 Exercícios

  1. Questão básica (Dificuldade: ⭐): Crie uma tabela de usuários com todas as restrições.

  2. Exercício avançado (Dificuldade: ⭐⭐): Crie uma chave estrangeira e teste as exclusões em cascata.

  3. Desafio (Dificuldade: ⭐⭐⭐): Crie uma tabela de produtos com uma restrição CHECK e verifique se a restrição é aplicada.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%