MySQL: Uma explicação detalhada das operações INSERT,…
Última atualização: 2026-08-26
Inserir, atualizar e excluir dados são operações básicas de banco de dados — INSERT, UPDATE e DELETE constituem o núcleo da DML.
Esta aula apresenta uma explicação sistemática sobre como inserir, atualizar e excluir dados.
graph TB
A[DML Operation] --> B[INSERT Insert]
A --> C[UPDATE Update]
A --> D[DELETE Delete]
B --> B1[Single-row insertion]
B --> B2[Multi-line Insertion]
B --> B3[Subquery Insertion]
B --> B4[UPSERT]
C --> C1[Conditional Update]
C --> C2[JOIN Update]
D --> D1[Conditional Deletion]
D --> D2[TRUNCATE Clear]
1. O que você vai aprender
- INSERT: inserções de uma linha, de várias linhas e com subconsultas
- ATUALIZAÇÃO: Atualização das condições
- EXCLUIR com condições
- TRUNCATE: Esvaziar a tabela
- INSERT ON DUPLICATE KEY UPDATE
2. Uma história real
(1) Problema: A inserção manual de dados, um por um, é extremamente ineficiente
O sistema de gestão de estoque processa mais de 10.000 gravações de dados diariamente. A equipe de operações realiza manualmente as operações INSERT e UPDATE, uma a uma, o que não só é extremamente ineficiente, mas também costuma levar à corrupção de dados devido a erros de copiar e colar. Durante um ajuste de preços em lote, a execução das instruções UPDATE, uma a uma, levou três horas; nesse período, um funcionário inseriu acidentalmente a cláusula WHERE errada, fazendo com que todos os preços da tabela fossem definidos como 0.
(2) Uma solução que combina operações em lote e transações
Utilize INSERTs em lote, UPDATEs transacionais e DELETEs condicionais, combinados com INSERT ON DUPLICATE KEY UPDATE, para processar todos os dados em uma única operação.
| Dimensão | Operações individuais | Operações em lote + transações |
|---|---|---|
| 10.000 gravações | ~3 horas | ~3 minutos |
| Risco de erro | Alto (sujeito a erros manuais) | Baixo (proteção de transações) |
| Idas e voltas na rede | 10.000 | 1 |
| Aumento de velocidade | — | 50x |
3. INSERT: Inserção de dados
▶ Exemplo: inserção de uma única linha
-- Insert in Full
INSERT INTO users (username, email, age)
VALUES ('alice', 'alice@email.com', 25);
-- Omit field names(Must be in order)
INSERT INTO users VALUES (1, 'bob', 'bob@email.com', 30);
▶ Exemplo: Inserção de várias linhas
INSERT INTO products (name, price, category) VALUES
('iPhone', 999, 'Phone'),
('MacBook', 1999, 'Laptop'),
('iPad', 599, 'Tablet');
▶ Exemplo: Inserção de uma subconsulta
-- Insert from Query Results
INSERT INTO user_archive (id, name, email)
SELECT id, name, email FROM users WHERE status = 'deleted';
4. ATUALIZAÇÃO: Atualizar dados
▶ Exemplo: Atualização condicional
-- Update a Single Record
UPDATE users SET email = 'new@email.com' WHERE id = 1;
-- Update Multiple Records
UPDATE products SET price = price * 1.1 WHERE category = 'Electronics';
-- Multi-Field Update
UPDATE users SET age = age + 1, status = 'active' WHERE id = 1;
▶ Exemplo: UPDATE + JOIN
-- Related Updates
UPDATE orders o
INNER JOIN customers c ON o.customer_id = c.id
SET o.status = 'priority'
WHERE c.level = 'VIP';
5. DELETE: Exclusão de dados
▶ Exemplo: Exclusão condicional
-- Delete a Single Record
DELETE FROM users WHERE id = 1;
-- Delete Multiple Records
DELETE FROM orders WHERE status = 'cancelled' AND created_at < '2025-01-01';
-- Deleting Related Records
DELETE o FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
WHERE c.status = 'banned';
(1) TRUNCATE x DELETE
| Dimensão | TRUNCATE | DELETE |
|---|---|---|
| Velocidade | Muito rápida | Lenta |
| Transação | Sem reversão | Com reversão |
| Acionador | Não acionado | Acionado |
| AUTO_INCREMENT | Reiniciar | Não reiniciar |
| ONDE | Não compatível | Compatível |
-- Clear the table (Non-rollbackable)
TRUNCATE TABLE temp_data;
6. INSERT ON DUPLICATE KEY UPDATE
Execute a atualização caso haja um conflito de chave primária ou chave única.
▶ Exemplo: Operação UPSERT
-- Insert or Update
INSERT INTO product_stats (product_id, view_count, last_viewed)
VALUES (1, 1, NOW())
ON DUPLICATE KEY UPDATE
view_count = view_count + 1,
last_viewed = NOW();
-- Batch UPSERT
INSERT INTO user_scores (user_id, score) VALUES
(1, 100), (2, 200), (3, 300)
ON DUPLICATE KEY UPDATE
score = VALUES(score);
7. REPLACE INTO
Exclua primeiro e, em seguida, insira (em caso de conflito).
▶ Exemplo: REPLACE
-- Replace if it exists, insert if it doesn't
REPLACE INTO users (id, username, email)
VALUES (1, 'alice_updated', 'alice_new@email.com');
8. Diretrizes de segurança
| Ação | Recomendação |
|---|---|
| ATUALIZAR/EXCLUIR | É necessário incluir uma cláusula WHERE; primeiro, use SELECT para confirmar o escopo da operação |
| Operações em massa | Executar em lotes de 1.000 a 5.000 linhas cada |
| Ambiente de produção | Inicie uma transação e, após a confirmação, execute o comando COMMIT |
| Backup | Antes da operação mysqldump Backup |
▶ Exemplo: Processo de atualização de segurança
-- 1. Check and confirm first
SELECT COUNT(*) FROM orders WHERE status = 'cancelled' AND created_at < '2025-01-01';
-- 2. Start a transaction
START TRANSACTION;
-- 3. Execute Delete
DELETE FROM orders WHERE status = 'cancelled' AND created_at < '2025-01-01';
-- 4. Submit after verifying that everything is correct
COMMIT;
-- Or roll back if a problem is detected
-- ROLLBACK;
❓ Perguntas Frequentes
P: A ordem dos campos em uma instrução INSERT precisa corresponder à definição da tabela? R: Só precisa corresponder quando os nomes dos campos são omitidos. Recomenda-se especificar explicitamente os nomes dos campos para não depender da ordem.
P: É possível recuperar dados após um DELETE? R: É possível executar um ROLLBACK dentro de uma transação. Para dados que já foram confirmados (COMMITTED), será necessário restaurá-los a partir de um backup. Um TRUNCATE não pode ser revertido.
P: Como posso otimizar operações INSERT em massa? R: Use VALUES com várias linhas, desative o auto-commit, desative os índices e use LOAD DATA INFILE.
P: Qual é a diferença entre INSERT e REPLACE? R: O INSERT retorna um erro se encontrar um conflito de chave única, enquanto o REPLACE exclui o registro antes de inserir um novo (o ID será alterado). Recomendamos usar ON DUPLICATE KEY UPDATE.
P: Qual é a diferença entre DELETE e TRUNCATE? R: DELETE exclui as linhas uma a uma e permite a reversão, enquanto TRUNCATE esvazia a tabela, não permite a reversão, mas é extremamente rápido.
📖 Resumo
- INSERT Inserir dados; suporta uma única linha, várias linhas e subconsultas
- ATUALIZAÇÃO Para atualizar os dados, é necessário incluir uma cláusula WHERE
- DELETE Exclui dados; deve incluir uma cláusula WHERE
- TRUNCATE Esvazia a tabela; é rápido, mas não pode ser revertido.
- INSERT ON DUPLICATE KEY UPDATE implementa o UPSERT
- Verifique e confirme antes de realizar qualquer operação; utilize a proteção de transações no ambiente de produção.
📝 Exercícios
-
Problema básico (Dificuldade ⭐): Insira 5 registros de teste na tabela
users. -
Problema avançado (Dificuldade: ⭐⭐): Implemente um contador de visitas usando
INSERT ON DUPLICATE KEY UPDATE. -
Desafio (Dificuldade: ⭐⭐⭐): Escreva um script para excluir com segurança os dados temporários de 30 dias atrás, utilizando proteção de transação.