Fundamentos das Restrições de Banco de Dados
As restrições (constraints) no MySQL são regras aplicadas às colunas de uma tabela para limitar o tipo de dados que pode ser inserido. O objetivo principal é assegurar a integridade, precisão e confiabilidade das informações, bloqueando operações que violem a lógica de negócio ou as regras semânticas do sistema.
A integridade dos dados é garantida através de quatro pilares fundamentais:
- Integridade de Entidade: Assegura que cada registro em uma tabela seja exclusivo e identificável (ex: não podem existir dois usuários com o mesmo identificador único).
- Integridade de Domínio: Restringe os valores permitidos para uma coluna específica (ex: idades devem ser números positivos, status deve ser 'ativo' ou 'inativo').
- Integridade Referencial: Mantém a consistência nas relações entre tabelas (ex: um pedido não pode ser associado a um cliente que não existe no banco de dados).
- Integridade Definida pelo Usuário: Regras personalizadas criadas para atender requisitos específicos de negócio (ex: senhas não podem ser nulas).
Classificação e Escopo
As restrições podem ser definidas no momento da criação da tabela (CREATE TABLE) e são categorizadas de acordo com seu escopo e funcionalidade:
- Por Escopo:
- Nível de Coluna: Aplicadas diretamente na definição de um único campo.
- Nível de Tabela: Declaradas separadamente e podem evnolver múltiplas colunas simultaneamente.
- Por Funcionalidade: Incluem restrições de não nulidade (
NOT NULL), unicidade (UNIQUE), chave primária (PRIMARY KEY), chave estrangeira (FOREIGN KEY), verificação (CHECK) e valor padrão (DEFAULT).
Inspecionando Restrições Existentes
Para auditar a estrutura atual de uma tabela e visualizar as regras aplicadas, utilizam-se os seguintes comandos:
SHOW CREATE TABLE nome_da_tabela;
DESCRIBE nome_da_tabela;
Sintaxe e Aplicação Prática
1. Números sem Sinal (UNSIGNED)
Por padrão, tipos numéricos no MySQL aceitam valores negativos. Quando o domínio do dado exige apenas números positivos (como idade, estoque ou identificadores), utiliza-se o modificador UNSIGNED.
CREATE TABLE inventory (
item_id INT UNSIGNED,
stock_quantity SMALLINT UNSIGNED
);
2. Preenchimento com Zeros (ZEROFILL)
O atributo ZEROFILL formata a exibição de números inteiros, preenchendo com zeros à esquerda até atingir a largura especificada. É útil para códigos de barras ou números de faturas que exigem um formato visual fixo.
CREATE TABLE invoices (
invoice_code INT(6) ZEROFILL
);
3. Restrição de Não Nulidade (NOT NULL)
Impede que uma coluna aceite valores NULL. É fundamental para campos obrigatórios, garantindo que nenhum registro seja criado com informações ausentes.
CREATE TABLE clients (
client_id INT,
full_name VARCHAR(100) NOT NULL,
registration_date DATE NOT NULL
);
4. Valores Padrão (DEFAULT)
Define um valor automático para uma coluna caso nenhum dado seja fornecido durante a instrução INSERT.
CREATE TABLE user_accounts (
account_id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
account_status VARCHAR(20) DEFAULT 'pending_verification'
);
5. Restrição de Unicidade (UNIQUE)
Garante que todos os valores em uma coluna (ou combinação de colunas) sejam distintos.
Unicidade em Coluna Única
CREATE TABLE subscribers (
sub_id INT UNIQUE,
email_address VARCHAR(150) NOT NULL
);
Unicidade Composta (Múltiplas Colunas)
A restrição é aplicada ao nível da tabela, impedindo que a combinação exata de valores se repita, embora valores individuais possam duplicar.
CREATE TABLE project_assignments (
developer_id INT,
project_id INT,
UNIQUE(developer_id, project_id)
);
6. Chave Primária (PRIMARY KEY)
A chave primária é o identificador exclusivo de uma tabela. Ela combina as regras de NOT NULL e UNIQUE. Motores de armazenamento como o InnoDB exigem uma chave primária para otimizar a indexação e a velocidade de busca em estrutrua B-Tree.
CREATE TABLE financial_transactions (
tx_id INT PRIMARY KEY,
amount DECIMAL(10,2),
tx_date TIMESTAMP
);
7. Auto Incremento (AUTO_INCREMENT)
Gera sequencialmente um novo número inteiro para cada registro inserido. É amplamente utilizado em chaves primárias para evitar a gestão manual de identificadores. O contador não retrocede em caso de exclusão de registros. Para reiniciar a contagem e limpar a tabela, utiliza-se TRUNCATE TABLE nome_da_tabela;.
CREATE TABLE audit_logs (
log_id INT PRIMARY KEY AUTO_INCREMENT,
action_description TEXT,
created_at DATETIME
);
INSERT INTO audit_logs (action_description) VALUES ('System startup'), ('User login');
8. Chaves Estrangeiras (FOREIGN KEY)
Uma chave estrangeira estabelece um vínculo entre duas tabelas, referenciando a chave primária de uma tabela pai. Isso assegura a integridade referencial, ditando como o banco de dados deve reagir a alterações ou exclusões nos dados relacionados.
Comportamentos de Integridade:
- Restrição (RESTRICT): Bloqueia a exclusão ou atualização de um registro na tabela pai se houver registros dependentes na tabela filha.
- Cascata (CASCADE): Propaga automaticamente a exclusão ou atualização da tabela pai para todas as linhas correspondentes na tabela filha.
Relacionamento Um-para-Muitos
Ocorre quando um registro na tabela pai pode estar associado a múltiplos registros na tabela filha. A chave estrangeira é sempre declarada no lado "muitos".
CREATE TABLE departments (
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(50) NOT NULL
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(100) NOT NULL,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(dept_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
Relacionamento Muitos-para-Muitos
Exige a criação de uma terceira tabela (tabela associativa ou de junção) que contenha chaves estrangeiras apontando para as chaves primárias de ambas as tabelas originais.
CREATE TABLE courses (
course_id INT PRIMARY KEY AUTO_INCREMENT,
course_title VARCHAR(100)
);
CREATE TABLE students (
student_id INT PRIMARY KEY AUTO_INCREMENT,
student_name VARCHAR(100)
);
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY AUTO_INCREMENT,
fk_student_id INT,
fk_course_id INT,
FOREIGN KEY (fk_student_id) REFERENCES students(student_id) ON DELETE CASCADE,
FOREIGN KEY (fk_course_id) REFERENCES courses(course_id) ON DELETE CASCADE
);
Relacionamento Um-para-Um
Um registro na tabela A corresponde a exatamente um registro na tabela B. A chave estrangeira pode ser colocada em qualquer uma das tabelas, mas recomenda-se inseri-la na tabela que será consultada com menos frequência ou que possui dependência lógica da outra. A restrição UNIQUE é obrigatória no campo da chave estrangeira.
CREATE TABLE user_profiles (
profile_id INT PRIMARY KEY AUTO_INCREMENT,
biography TEXT,
avatar_url VARCHAR(255)
);
CREATE TABLE system_users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
login_email VARCHAR(100) NOT NULL,
profile_id INT UNIQUE,
FOREIGN KEY (profile_id) REFERENCES user_profiles(profile_id)
ON UPDATE CASCADE
ON DELETE SET NULL
);