Entendendo Restrições de Tabela no MySQL para Integridade de Dados

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.

Tags: MySQL restrições de banco de dados SQL Chave Primária chave estrangeira

Publicado em 6-12 20:40 por Thomas