Douglas Legramante

Douglas Legramante

Informática

Técnico em Informática · Banco de Dados

19-Prática consolidada do bloco DML

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:

TabelaPara que serveChaves
clientequem compraPK id_cliente; cpf único
produtoo que a loja vendePK id_produto
pedidouma compra feita por um clientePK id_pedido; FK cliente_id → cliente
item_pedidocada produto dentro de um pedidoPK 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

  1. No Workbench, abra uma nova aba SQL (ícone de folha com "+").
  2. 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.
  3. Execute o script inteiro: Ctrl + Shift + Enter (ou o ícone do raio, sem nada selecionado).
  4. No Navigator, clique com o botão direito em Schemas → Refresh All. O loja_dml deve aparecer.
  5. 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_clientenomecpf
1Marina Alves12345678901
2Paulo Nunes23456789012
3Julia Ramos34567890123

produto

id_produtonomeprecotamanho
1Camiseta Basica39.90M
2Calca Jeans119.9042
3Bermuda59.90G
4Bone29.90U

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:

  1. O que o MySQL respondeu? (copie a mensagem)
  2. Por que isso aconteceu?
  3. 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

Para se aprofundar