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.
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
- CHAVE PRIMÁRIA Restrição de chave primária
- CHAVE ESTRANGEIRA: Restrições de chave estrangeira e efeito em cascata
- UNIQUE: Restrição única
- Restrição “NOT NULL” (não nulo)
- CHECK Restrições de verificação (8.0+)
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
-- 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)
);
5. CHAVE ESTRANGEIRA
▶ Exemplo: Chaves estrangeiras e cascata
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
6. Restrição UNIQUE
▶ Exemplo: Restrição de exclusividade
-- 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)
);
7. Restrição NOT NULL
▶ Exemplo: Restrição “Not-Null”
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
description TEXT -- Allow NULL
);
8. Restrições CHECK (8.0+)
▶ Exemplo: Restrição CHECK
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;
9. Gerenciamento de restrições
▶ Exemplo: Adicionar/remover restrições
-- 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;
❓ 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
- CHAVE PRIMÁRIA: Identificador único; cria automaticamente um índice agrupado
- CHAVE ESTRANGEIRA Estabelece relações entre tabelas; suporta CASCADE, SET NULL e RESTRICT
- ÚNICO: Os valores devem ser únicos; valores NULL são permitidos
- NOT NULL Não permite valores NULL
- VERIFICAR (8.0+) Certifique-se de que o valor atenda aos critérios
📝 Exercícios
-
Questão básica (Dificuldade: ⭐): Crie uma tabela de usuários com todas as restrições.
-
Exercício avançado (Dificuldade: ⭐⭐): Crie uma chave estrangeira e teste as exclusões em cascata.
-
Desafio (Dificuldade: ⭐⭐⭐): Crie uma tabela de produtos com uma restrição CHECK e verifique se a restrição é aplicada.