19-Prática consolidada do bloco DML
Materiais desta aula
Prática consolidada do bloco DML
1. O que vamos fazer hoje
Nos Encontros 17 e 18 vimos os três comandos do DML: INSERT (inserir), UPDATE (alterar) e DELETE (excluir). Hoje usamos todos eles juntos, num banco novo, e aprendemos a ler as mensagens de erro do MySQL — porque quem sabe ler o erro conserta o comando sozinho.
A única novidade é um erro do Workbench, o 1175 (Safe Updates), que aparece de vez em quando e confunde muita gente.
2. O cenário: uma loja de roupas
Para não mexer no banco biblioteca, vamos criar um banco novo, o loja_dml, com quatro tabelas:
| Tabela | Para que serve | Chaves |
|---|---|---|
cliente | quem compra | PK id_cliente; cpf único |
produto | o que a loja vende | PK id_produto |
pedido | uma compra feita por um cliente | PK id_pedido; FK cliente_id → cliente |
item_pedido | cada produto dentro de um pedido | PK composta (pedido_id, produto_id); FKs para pedido e produto |
Lendo como história: um cliente faz um pedido; o pedido tem vários itens; cada item é um produto. Quem é "pai" e quem é "filho"? cliente e produto são pais; pedido é filho de cliente; item_pedido é filho de pedido e de produto.
3. Preparando o ambiente
- No Workbench, abra uma nova aba SQL (ícone de folha com "+").
- Abra o script do encontro (File → Open SQL Script, arquivo
encontro_19_script_loja_dml.sql) ou copie e cole o script do anexo do exercício. - Execute o script inteiro: Ctrl + Shift + Enter (ou o ícone do raio, sem nada selecionado).
- No Navigator, clique com o botão direito em Schemas → Refresh All. O
loja_dmldeve aparecer. - Confira:
SELECT * FROM cliente;
O script começa com DROP DATABASE IF EXISTS loja_dml; — ele apaga o banco loja_dml se já existir e recria tudo. Isso é útil: se você bagunçou os dados, rode o script de novo e recomeça do zero. (Cuidado: nunca use DROP DATABASE com o nome de outro banco!)
Os dados iniciais
cliente
| id_cliente | nome | cpf |
|---|---|---|
| 1 | Marina Alves | 12345678901 |
| 2 | Paulo Nunes | 23456789012 |
| 3 | Julia Ramos | 34567890123 |
produto
| id_produto | nome | preco | tamanho |
|---|---|---|---|
| 1 | Camiseta Basica | 39.90 | M |
| 2 | Calca Jeans | 119.90 | 42 |
| 3 | Bermuda | 59.90 | G |
| 4 | Bone | 29.90 | U |
pedido: (1, 2026-10-01, cliente 1) e (2, 2026-10-02, cliente 2). item_pedido: (pedido 1, produto 1, qtde 2), (pedido 1, produto 4, qtde 1), (pedido 2, produto 2, qtde 1).
Repare: a Julia (cliente 3) e a Bermuda (produto 3) não têm nenhum pedido — vão ser úteis para treinar exclusões.
4. Diagnóstico: "encontre o erro"
Diagnóstico é o que o médico faz: antes de dar o remédio, descobre o que está errado. Para cada comando quebrado, responda a três perguntas:
- O que o MySQL respondeu? (copie a mensagem)
- Por que isso aconteceu?
- Como corrijo o comando?
4.1 Erro 1136 — quantidade de colunas diferente da de valores
INSERT INTO cliente (id_cliente, nome, cpf) VALUES (4, 'Rafael Lima');
-- Error Code: 1136. Column count doesn't match value count at row 1
Foram listadas 3 colunas e dados só 2 valores. Cada coluna precisa de um valor, na mesma ordem. Correção: VALUES (4, 'Rafael Lima', '45678901234');
4.2 Erro 1054 — coluna desconhecida (faltaram as aspas)
UPDATE produto SET tamanho = G WHERE id_produto = 4;
-- Error Code: 1054. Unknown column 'G' in 'field list'
Sem aspas, o MySQL entende G como o nome de uma coluna — e não existe coluna G. Texto e datas vão entre aspas simples. Correção: SET tamanho = 'G'.
4.3 UPDATE sem WHERE (só para ler — não execute!)
UPDATE produto SET preco = 0;
A intenção era mudar o preço de um produto. Sem WHERE, o comando muda todos: os 4 produtos ficariam grátis! (Se o Safe Updates estiver ligado, o Workbench recusa com o erro 1175 — veja a seção 5.) Correção: incluir o WHERE com a chave, por exemplo WHERE id_produto = 3. E lembre do hábito: SELECT antes.
4.4 "0 row(s) affected" — AND impossível
UPDATE produto SET preco = 49.90 WHERE id_produto = 2 AND id_produto = 3;
-- 0 row(s) affected
Nenhum erro, e mesmo assim nada mudou. Nenhum produto tem id_produto 2 e 3 ao mesmo tempo. A intenção era alterar os dois, então o conector certo é OR: WHERE id_produto = 2 OR id_produto = 3.
4.5 Erro 1452 — filho sem pai
INSERT INTO item_pedido (pedido_id, produto_id, quantidade) VALUES (9, 1, 1);
-- Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
Não existe pedido 9: o item ficaria "órfão". (Já vimos isso no Encontro 17.) Correção: usar um pedido que existe (ex.: VALUES (2, 1, 1)) ou inserir o pedido 9 antes e só depois o item.
4.6 Erro 1451 — pai com filhos
DELETE FROM cliente WHERE id_cliente = 1;
-- Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
A Marina tem o pedido 1: excluí-la deixaria o pedido órfão. (Já vimos isso no Encontro 18.) Correções possíveis: excluir um cliente sem pedidos (a Julia, por exemplo) ou apagar primeiro os itens e o pedido da Marina (veja a seção 6).
5. Erro 1175 — Safe Updates (novidade do dia)
O Workbench pode vir com um modo de proteção chamado Safe Updates. Com ele ligado, o Workbench recusa UPDATE e DELETE cujo WHERE não use uma coluna-chave (ex.: a PK):
UPDATE produto SET tamanho = 'M' WHERE nome = 'Bone';
-- Error Code: 1175. You are using safe update mode and you tried to update a table
-- without a WHERE that uses a KEY column.
nome não é chave, então o Workbench barra. Correção: usar a chave no WHERE.
UPDATE produto SET tamanho = 'M' WHERE id_produto = 4;
Ele também barra UPDATE/DELETE sem WHERE nenhum — é uma rede de segurança contra o erro que vimos no Encontro 18. Dá para desligar em Edit → Preferences → SQL Editor → Safe Updates (e reconectar), mas não desligue sem autorização do professor: ele existe para proteger você.
Atenção: o 1175 é uma regra do Workbench, não do MySQL. Por isso o mesmo comando pode funcionar em outro programa.
6. Ordem de inserção × ordem de exclusão
A regra que atravessa tudo hoje:
- Inserir: primeiro os pais, depois os filhos (cliente → pedido → item_pedido).
- Excluir: primeiro os filhos, depois os pais (item_pedido → pedido → cliente).
Exemplo — cancelar o pedido 2 e remover o cliente 2 (Paulo):
DELETE FROM item_pedido WHERE pedido_id = 2; -- 1º: os itens (filhos do pedido)
DELETE FROM pedido WHERE id_pedido = 2; -- 2º: o pedido (filho do cliente)
DELETE FROM cliente WHERE id_cliente = 2; -- 3º: por fim, o cliente
Se trocar a ordem, o MySQL responde com o erro 1451. Imagine desmontar uma torre de blocos: a gente tira de cima para baixo.
7. Autoavaliação
Ao final, marque o que você consegue fazer sozinho:
- ☐ Montar um INSERT com colunas e valores na mesma quantidade e ordem.
- ☐ Usar aspas simples em textos e datas.
- ☐ Fazer um SELECT antes de UPDATE/DELETE.
- ☐ Explicar a diferença entre AND e OR num WHERE.
- ☐ Dizer a ordem certa para inserir e para excluir com FK.
- ☐ Entender o que significam os erros 1136, 1054, 1452, 1451 e 1175.
8. Prévia do próximo encontro
No próximo encontro, vamos popular um banco de dados completo: criar e preencher um banco do zero, com várias tabelas relacionadas, aplicando tudo o que vimos no bloco DML.
Vídeos sobre o assunto
- Curso MySQL — INSERT, UPDATE e DELETE — CursoemVideo, mesma série dos encontros anteriores.
Para se aprofundar
- ERROR 1175: You are using safe update mode — Bytebase — explica o erro 1175, por que ele aparece e as formas de resolver (em inglês).