🎯 ATIVIDADE 05 — LEVANTANDO AS PAREDES
Bem-vindo à quinta semana (4 aulas) do curso de Banco de Dados. Hoje vamos abrir o terminal e "levantar as paredes" do nosso sistema usando a DDL (Data Definition Language). No mercado, um script DDL bem escrito é a fundação de qualquer software de sucesso. 🛡️🧩
🎯 Objetivo da Aula
Ao final desta semana, você será capaz de:
- Criar bancos de dados reais no MySQL e PostgreSQL.
- Implementar tabelas usando o comando
CREATE TABLE. - Configurar restrições de integridade (PK, FK, NOT NULL, UNIQUE, CHECK).
- Dominar a Ordem de Criação dos objetos.
🏢 O Cenário Prático (Seu Desafio)
A TecProExpress precisa que você execute o script oficial de criação do banco. O CTO exige que o script seja "limpo" e que as chaves estrangeiras tenham nomes padronizados (ex: fk_pedido_cliente).
📊 Hierarquia de Criação (O que vem primeiro?)
Para evitar erros de "tabela não encontrada", siga esta ordem lógica:
graph TD
A["1. Tabelas Independentes (Pais)"] --> B["2. Tabelas Dependentes (Filhos)"]
B --> C["3. Tabelas Associativas (Netos)"]
subgraph Exemplos
E1[CLIENTE] --- E2[PRODUTO]
E3[PEDIDO] --- E4[ITEM_PEDIDO]
end
E1 --> E3
E2 --> E4
E3 --> E4
style A fill:#e8f5e9
style C fill:#fffde7
🧠 Fundamentos: A Teoria Traduzida
DDL é a engenharia civil dos dados.
| Comando | Função | Analogia |
|---|---|---|
| CREATE | Cria objetos | Construir a casa |
| ALTER | Modifica objetos | Fazer uma reforma |
| DROP | Deleta objetos | Demolir a estrutura |
📖 Exemplo Guiado: Criando a Tabela Produto
Veja como definir tipos de dados e restrições no PostgreSQL (SGBD Foco) e no MySQL (Comparação).
🐬 Iniciando o Banco de Dados
Antes de criar qualquer tabela, é mandatório criar o container lógico (Banco de Dados) e dizer ao SGBD qual banco utilizar:
-- Executar no Console de Query (pgAdmin/DBeaver/Workbench)
CREATE DATABASE tecpro_express;
No pgAdmin (PostgreSQL), após criar o banco, você deve clicar com o botão direito no banco tecpro_express na árvore de navegação esquerda e selecionar Query Tool para garantir que as tabelas sejam criadas dentro dele.
No MySQL Workbench/DBeaver, use o comando:
USE tecpro_express;
🛠️ Código do Exemplo (Equivalência Relacional)
```sql
-- 🐘 Padrão PostgreSQL (pgAdmin)
CREATE TABLE produto (
id SERIAL PRIMARY KEY, -- SERIAL gera inteiros sequenciais automáticos
nome VARCHAR(100) NOT NULL, -- Texto obrigatório
preco DECIMAL(10,2) CHECK (preco > 0) -- Validação de integridade física
);
-- 🐬 Padrão MySQL (Workbench)
CREATE TABLE produto (
id INT PRIMARY KEY AUTO_INCREMENT, -- AUTO_INCREMENT gera inteiros sequenciais
nome VARCHAR(100) NOT NULL,
preco DECIMAL(10,2) CHECK (preco > 0)
);
#### 🔍 Detalhamento do Código:
* `SERIAL` vs `AUTO_INCREMENT`: Ambas as cláusulas servem para gerar números sequenciais únicos automáticos (Chaves Primárias Surrogadas). O PostgreSQL usa o tipo virtual `SERIAL`, enquanto o MySQL usa o modificador `AUTO_INCREMENT` no tipo `INT`.
* `DECIMAL(10,2)`: Ideal para armazenar valores monetários (10 dígitos totais de precisão, sendo 2 após a vírgula).
* `CHECK`: Restrição física de coluna que impede que a **TecProExpress** registre preços menores ou iguais a zero.
---
## 🛠️ Prática Obrigatória 1: Script de Infraestrutura
**Cenário:** Criação das tabelas `CLIENTE` e `PEDIDO`.
1. A tabela `CLIENTE` deve ter um ID auto-incremental e um CPF único.
2. A tabela `PEDIDO` deve ter uma FK apontando para `CLIENTE`.
### 🏁 Resultado Esperado (Seed Visual)
Ao rodar `DESCRIBE pedido;` no seu banco, você deverá ver:
* `id_cliente` marcado como **MUL** (Multiple) ou **FK**.
---
## 🛠️ Prática Obrigatória 2: O Elo Perdido (Associativa)
**Cenário:** Implementação da tabela `ITEM_PEDIDO`.
1. Esta tabela deve conectar `PEDIDO` e `PRODUTO` (Tabela Associativa N:M).
2. Adicione a coluna `quantidade` com valor padrão **1**.
3. Implemente a **Chave Primária Composta** formada pelas duas chaves estrangeiras.
### 🏁 Resultado Esperado (Script SQL Correto)
```sql
CREATE TABLE item_pedido (
id_pedido INT,
id_produto INT,
quantidade INT DEFAULT 1,
PRIMARY KEY (id_pedido, id_produto),
CONSTRAINT fk_item_pedido_ped FOREIGN KEY (id_pedido) REFERENCES pedido(id),
CONSTRAINT fk_item_pedido_prod FOREIGN KEY (id_produto) REFERENCES produto(id)
);
📤 Instruções de Entrega (Microsoft Teams)
Após testar os comandos e confirmar a criação bem-sucedida das tabelas no pgAdmin (ou SGBD de sua preferência):
- Organize as instruções em ordem cronológica de criação (pais antes dos filhos).
- Salve as instruções SQL em um único arquivo de texto com a extensão
.sqlcontendoCREATE DATABASEno início. - Envie o arquivo (
Atividade_05_SeuNome.sql) na tarefa correspondente no Microsoft Teams para avaliação de sintaxe e restrições.
💡 Checkpoint de Lógica
[!IMPORTANT] Reflexão Profissional: O que acontece se você tentar deletar um CLIENTE que já tem PEDIDOS cadastrados? O banco impedirá a exclusão para proteger a Integridade Referencial. Isso é segurança de dados na prática! 🧠🛡️
🔥 Desafio de Fixação (Opcional)
Nível: Arquiteto 🏆
Pesquise a diferença entre INT, BIGINT e SERIAL. Qual deles você usaria para um sistema que processa 1 bilhão de entregas por mês?
🔑 Gabarito de Código/Fórmulas Completo
🐘 Gabarito Oficial PostgreSQL (pgAdmin)
-- 1. Criar Banco de Dados
CREATE DATABASE tecpro_express;
-- (Nota: No pgAdmin, lembre-se de abrir uma Query Tool apontando para o banco tecpro_express após criá-lo)
-- 2. Criar Tabelas Pais
CREATE TABLE cliente (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
cpf CHAR(11) UNIQUE
);
CREATE TABLE produto (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
preco DECIMAL(10,2) CHECK (preco > 0)
);
-- 3. Criar Tabela Dependente (Filho)
CREATE TABLE pedido (
id SERIAL PRIMARY KEY,
data_ped DATE,
id_cliente INT,
CONSTRAINT fk_ped_cli FOREIGN KEY (id_cliente) REFERENCES cliente(id)
);
-- 4. Criar Tabela Associativa (Neto)
CREATE TABLE item_pedido (
id_pedido INT,
id_produto INT,
quantidade INT DEFAULT 1,
PRIMARY KEY (id_pedido, id_produto),
CONSTRAINT fk_item_ped FOREIGN KEY (id_pedido) REFERENCES pedido(id),
CONSTRAINT fk_item_prod FOREIGN KEY (id_produto) REFERENCES produto(id)
);
🐬 Gabarito Alternativo MySQL (DBeaver / Workbench)
-- 1. Criar e Usar Banco
CREATE DATABASE tecpro_express;
USE tecpro_express;
-- 2. Criar Tabelas Pais
CREATE TABLE cliente (
id INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(100) NOT NULL,
cpf CHAR(11) UNIQUE
);
CREATE TABLE produto (
id INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(100) NOT NULL,
preco DECIMAL(10,2) CHECK (preco > 0)
);
-- 3. Criar Tabela Dependente
CREATE TABLE pedido (
id INT PRIMARY KEY AUTO_INCREMENT,
data_ped DATE,
id_cliente INT,
CONSTRAINT fk_ped_cli FOREIGN KEY (id_cliente) REFERENCES cliente(id)
);
-- 4. Criar Tabela Associativa
CREATE TABLE item_pedido (
id_pedido INT,
id_produto INT,
quantidade INT DEFAULT 1,
PRIMARY KEY (id_pedido, id_produto),
CONSTRAINT fk_item_ped FOREIGN KEY (id_pedido) REFERENCES pedido(id),
CONSTRAINT fk_item_prod FOREIGN KEY (id_produto) REFERENCES produto(id)
);
🔍 Explicação do Gabarito:
- Ordem de Criação: Os bancos de dados exigem que tabelas sem Foreign Keys (
cliente,produto) sejam criadas primeiro, antes das tabelas que fazem referência a elas (pedido,item_pedido). Caso contrário, ocorrerá erro de referência. - UNIQUE: Garante a integridade lógica (ex: impossibilita que dois clientes compartilhem o mesmo CPF).
- CONSTRAINT: Dar nomes explícitos às chaves estrangeiras (ex:
fk_ped_cli) facilita diagnósticos de erros e remoção de restrições em updates de produção.