Guia Abrangente de Restrições no MySQL: Sintaxe, Conceitos e Relacionamentos

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
);

Tags: MySQL SQL Relational-Databases data-integrity primary-key

Publicado em 9-27 07:35