DML — INSERT, UPDATE, DELETE
Insira, atualize e remova dados com segurança
DML (Data Manipulation Language) é o conjunto de comandos para inserir, atualizar e remover dados: INSERT INTO, UPDATE e DELETE. Ao contrário do SELECT, esses comandos modificam o estado do banco de dados.
INSERT INTO adiciona novas linhas. UPDATE modifica linhas existentes — sempre use WHERE para evitar atualizar toda a tabela acidentalmente. DELETE remove linhas — sempre use WHERE, ou use TRUNCATE se quiser limpar toda a tabela (mais rápido, sem rollback).
Em produção, comandos DML devem ser executados dentro de transações (BEGIN/COMMIT/ROLLBACK) para garantir consistência. Sempre teste com SELECT antes de executar UPDATE ou DELETE.
-- INSERT — uma linha
INSERT INTO clientes (nome, email, cidade)
VALUES ('Maria Silva', 'maria@email.com', 'São Paulo');
-- INSERT — múltiplas linhas
INSERT INTO produtos (nome, preco, estoque)
VALUES
('Teclado', 199.90, 50),
('Mouse', 89.90, 100),
('Monitor', 1299.00, 20);
-- INSERT a partir de SELECT
INSERT INTO clientes_vip (cliente_id, desde)
SELECT id, NOW()
FROM clientes
WHERE total_compras > 10000;
-- UPDATE — SEMPRE use WHERE!
UPDATE produtos
SET preco = preco * 1.10, -- aumento de 10%
atualizado_em = NOW()
WHERE categoria = 'eletronicos';
-- UPDATE com JOIN (PostgreSQL/MySQL)
UPDATE funcionarios f
SET salario = salario * 1.15
FROM departamentos d
WHERE f.departamento_id = d.id
AND d.nome = 'Engenharia';
-- DELETE — SEMPRE use WHERE!
DELETE FROM sessoes WHERE expira_em < NOW();
-- Testar antes de deletar (boa prática)
SELECT COUNT(*) FROM sessoes WHERE expira_em < NOW();
-- ok? então execute:
DELETE FROM sessoes WHERE expira_em < NOW();
-- TRUNCATE — limpa toda a tabela (sem WHERE, sem rollback fácil)
TRUNCATE TABLE log_temporario;
-- Transação para segurança
BEGIN;
UPDATE contas SET saldo = saldo - 500 WHERE id = 1;
UPDATE contas SET saldo = saldo + 500 WHERE id = 2;
COMMIT; -- ou ROLLBACK em caso de erroAntes de qualquer UPDATE ou DELETE em produção, execute um SELECT com as mesmas condições do WHERE para confirmar quantas linhas serão afetadas.