🛡️ RESTRIÇÕES DE INTEGRIDADE EM SQL
As restrições (Constraints) garantem que os dados inseridos no banco sigam as regras de negócio e mantenham a consistência. 🛡️🧩
Objetivo: Dominar as restrições de integridade (NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK) para blindar o banco de dados contra inconsistências lógicas.
📗 PASSO 1: Valores NULL e DEFAULT
Por padrão, a SQL permite valores nulos (exceto PKs). 🛡️
- 🚫 NOT NULL: Torna o campo obrigatório.
- ⚙️ DEFAULT: Define um valor padrão automático.
CREATE TABLE CONTATO (
ID INT PRIMARY KEY,
NOME VARCHAR(30) NOT NULL,
SOBRENOME VARCHAR(30) NOT NULL DEFAULT 'SILVA',
NASCIMENTO DATE,
ATIVO BOOLEAN DEFAULT TRUE,
PESO DECIMAL(5,2)
);
📗 PASSO 2: Chaves e Identificadores
🥇 Chave Primária (PRIMARY KEY)
Identifica unicamente cada registro. Pode ser simples ou composta (M:N).
CREATE TABLE PERFIL_USUARIO (
USER_ID INT,
PERFIL_ID INT,
PRIMARY KEY (USER_ID, PERFIL_ID) -- CHAVE COMPOSTA
);
🆔 Chave Única (UNIQUE)
Impede duplicidade em colunas que não são PK (ex: CPF, E-mail).
CREATE TABLE USUARIO (
ID INT PRIMARY KEY,
CPF CHAR(11) UNIQUE -- VALOR ÚNICO
);
📗 PASSO 3: Chave Estrangeira (FOREIGN KEY)
Estabelece o vínculo entre tabelas com Ações Referenciais:
RESTRICT: Impede a exclusão do pai se houver filhos.CASCADE: Exclui os filhos automaticamente (Cuidado!).SET NULL: Zera a referência no filho.
-- Criando a tabela de dependentes (Relacionamento 1:N)
CREATE TABLE TELEFONE (
ID INT PRIMARY KEY,
NUMERO VARCHAR(15) NOT NULL,
CONTATO_ID INT,
FOREIGN KEY (CONTATO_ID) REFERENCES CONTATO(ID) ON DELETE CASCADE
);
📗 PASSO 4: Restrição de Verificação (CHECK)
Valida regras de negócio diretamente no motor do banco.
CREATE TABLE PRODUTO (
ID INT PRIMARY KEY,
PRECO DECIMAL(10,2) CHECK (PRECO > 0), -- PREÇO POSITIVO
ESTOQUE INT CHECK (ESTOQUE >= 0) -- ESTOQUE NÃO NEGATIVO
);
📗 PASSO 5: Melhores Práticas (Naming Constraints)
Nomear restrições facilita a leitura de erros e manutenção:
CREATE TABLE AGENDA.EVENTO (
ID INT PRIMARY KEY,
PRIORIDADE INT,
CONSTRAINT CK_PRIORIDADE CHECK (PRIORIDADE BETWEEN 1 AND 5)
);
💡 Dica do Especialista: Se você não nomear sua constraint, o SGBD criará um nome aleatório (ex:
SYS_C00123), o que torna o debug muito mais difícil. 🚀🛡️