Para garantir a integridade e a consistência dos dados, os sistemas de banco de dados relacionais, como o MySQL, empregam mecanismos de validação denominados restrições. Essas regras definidas no nível da tabela impedem a inserção ou modificação de dados que violem os princípios estabelecidos pelo esquema do banco de dados. Este guia aborda os principais tipos de restrições no MySQL, seus casos de uso e considerações práticas.
Tipos Fundamentais de Restrições
NOT NULL
Essa restrição proíbe a inserção de valores nulos em uma coluna específica, sendo crucial para campos que devem obrigatoriamente conter um valor.
CREATE TABLE Clientes (
id_cliente INT AUTO_INCREMENT PRIMARY KEY,
nome_completo VARCHAR(120) NOT NULL,
contato_email VARCHAR(150) NOT NULL
);
No esquema acima, as colunas nome_completo e contato_email não podem permanecer vazias durante a inserção de um novo cliente.
UNIQUE
A restrição UNIQUE assegura que todos os valores em uma coluna ou conjunto de colunas sejam distintos, prevenindo entradas duplicadas.
CREATE TABLE Produtos (
codigo_produto INT AUTO_INCREMENT PRIMARY KEY,
nome_produto VARCHAR(80) NOT NULL UNIQUE,
sku VARCHAR(30) UNIQUE
);
Aqui, cada nome de produto e cada código SKU devem ser únicos no sistema.
PRIMARY KEY
Uma chave primária identifica de forma única cada registro em uma tabela. Geralmente, ela é implementada em uma coluna de identificador auto-incremento, mas também pode ser uma combinação de colunas.
CREATE TABLE Pedidos (
id_pedido INT AUTO_INCREMENT PRIMARY KEY,
data_pedido DATETIME NOT NULL,
valor_total DECIMAL(12,2)
);
O campo id_pedido serve como identificador exclusivo para cada transação de venda.
FOREIGN KEY
Uma chave estrangeira estabelece um vínculo entre dados de duas tabelas. Ela reforça a integridade referencial, garantindo que um valor na tabela filha exista na tabela pai.
CREATE TABLE DetalhesPedido (
id_item INT AUTO_INCREMENT PRIMARY KEY,
id_pedido INT NOT NULL,
quantidade INT DEFAULT 1,
preco_unitario DECIMAL(10,2),
FOREIGN KEY (id_pedido) REFERENCES Pedidos(id_pedido)
);
Neste caso, qualquer id_pedido inserido em DetalhesPedido deve corresponder a um id_pedido válido na tabela Pedidos.
CHECK (MySQL 8.0.16+)
A restrição CHECK permite definir uma condição booleana que os valores das colunas devem satisfazer. O MySQL a executa a partir da versão 8.0.16.
CREATE TABLE Funcionarios (
id_func INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100),
salario_mensal DECIMAL(12,2) CHECK (salario_mensal >= 0),
idade_minima INT,
CONSTRAINT chk_idade CHECK (idade_minima >= 18)
);
As colunas salario_mensal e idade_minima são validadas para não receberem valores negativos ou abaixo de 18, respectivamente.
Modificando Restrições em Tabelas Existentes
As restrições podem ser gerenciadas após a criação da tabela usando comandos ALTER TABLE.
-- Adicionando uma restrição UNIQUE a uma coluna existente
ALTER TABLE Produtos ADD CONSTRAINT unq_codigo_barras UNIQUE (codigo_barras);
-- Removendo uma restrição pelo seu nome
ALTER TABLE Produtos DROP INDEX unq_codigo_barras;
Lembre-se de que o MySQL não permite a alteração direta de uma restrição. O procedimento padrão é remmovê-la e criá-la novamente com as novas especificações.
Práticas Recomendadas
Ao projetar esquemas, defina restrições que reflitam as regras de negócio inquebráveis. Utilize chaves primárias e estrangeiras para modelar relacionamentos claros entre entidades. Prefira CHECK para validações de domínio simples, liberando a lógica complexa para a camada de aplicação. Documente as restrições impostas, pois elas afetam diretamente a forma como os dados são inseridos e atualizados, impactando consultas e integrações.