【Tutorial de SQL INSERT】Como Adicionar Novos Dados a uma Tabela com a Instrução INSERT INTO
Cadastros de usuários em um site, novas postagens em um blog, registros de produtos em um site de e-commerce... As aplicações web ganham vida porque novos dados são constantemente criados. A operação fundamental e crucial de "registrar novos dados em um banco de dados" é realizada pela instrução INSERT do SQL.
A instrução INSERT é um comando para escrever uma nova linha no grande livro-razão que é um banco de dados. Sua sintaxe pode parecer simples à primeira vista, mas oferece uma variedade de usos, desde adicionar uma única linha até a inserção em massa de várias linhas, e até mesmo copiar dados de outra tabela. No entanto, por causa de sua simplicidade, um pequeno erro pode facilmente levar a um erro, tornando-se um obstáculo comum para iniciantes.
Este artigo explicará detalhadamente tudo o que você precisa para dominar a instrução INSERT, desde a sintaxe básica até aplicações práticas, bem como erros frequentes e suas soluções, tudo acompanhado por muitos códigos "copiar-colar-e-executar". Vamos dar o primeiro passo no mundo do SQL executando o código e sentindo a satisfação de "dados sendo adicionados"!
Preparação: Vamos Preparar uma Tabela para os Dados
Para adicionar dados, você primeiro precisa de uma "caixa" para colocá-los, ou seja, uma tabela. Desta vez, vamos criar uma tabela chamada products para gerenciar informações sobre novos produtos. Usaremos esta tabela ao longo de todo o artigo.
Preste atenção na coluna id com INTEGER PRIMARY KEY. Em muitos bancos de dados (como SQLite, ou usando AUTO_INCREMENT no MySQL), esta configuração atribui automaticamente um ID único toda vez que você adiciona dados. Isso se tornará importante mais tarde.
-- Se a tabela products existir, exclua-a (para testes repetíveis)
DROP TABLE IF EXISTS products;
-- Crie uma nova tabela products
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
category TEXT,
price INTEGER,
release_date DATE
);
Com isso, temos uma tabela vazia pronta para os dados dos produtos. Vamos começar a dar vida a esta tabela imediatamente.
【O Básico】INSERT INTO ... VALUES: Adicionando uma Única Linha de Dados
Primeiro, vamos ver a forma básica da instrução INSERT: "adicionando uma única linha de dados". A sintaxe é INSERT INTO nome_da_tabela (coluna1, coluna2, ...) VALUES (valor1, valor2, ...);. A chave é que a lista de colunas no primeiro conjunto de parênteses corresponde um a um com a lista de valores após VALUES.
INSERT INTO products (name, category, price, release_date)
VALUES ('Maçã Milagrosa', 'Mercearia', 500, '2025-07-01');
Quando você executa esta consulta, um novo produto é adicionado à tabela products. Nós não especificamos a coluna id, mas como a configuramos para gerar números automaticamente ao criar a tabela, o banco de dados atribui automaticamente o valor 1. Esta é uma grande vantagem de usar uma chave primária autoincrementável.
Vamos verificar se foi adicionado. Se você executar SELECT * FROM products;, deverá ver os dados que acabou de inserir.
SELECT * FROM products;
Resultado:
id | name | category | price | release_date
---|-----------------|-----------|-------|-------------
1 | Maçã Milagrosa | Mercearia | 500 | 2025-07-01
Além disso, se os valores para algumas colunas ainda não estiverem decididos (limitado a colunas que permitem NULL), você pode omitir essas colunas ao inserir.
-- Inserir omitindo preço (price) e data de lançamento (release_date)
INSERT INTO products (name, category)
VALUES ('Pêssego Fantasma', 'Mercearia');
Neste caso, price e release_date conterão NULL (nenhum valor).
【Aplicação 1】Adicionando Várias Linhas de Dados de Uma Vez
Registrar novos produtos um por um pode ser um pouco tedioso. Com a instrução INSERT, você pode adicionar múltiplos dados de uma só vez em uma única consulta.
A sintaxe é simples: basta listar várias listas de valores entre () após a palavra-chave VALUES, separadas por vírgulas (,). Isso é mais eficiente do que repetir a instrução INSERT para cada linha, pois requer apenas uma viagem de ida e volta ao banco de dados.
INSERT INTO products (name, category, price, release_date) VALUES
('Teclado Mágico', 'Gadgets', 12000, '2025-07-10'),
('Mouse Arco-Íris', 'Gadgets', 5000, '2025-07-20'),
('Uvas Celestiais', 'Mercearia', 2500, '2025-08-01');
Com esta única consulta, três registros de produtos foram adicionados de uma vez. Esta é uma técnica muito útil para tarefas como preencher dados iniciais ou registrar dados carregados de um arquivo CSV em massa.
【Aplicação 2】Copiando Dados de Outra Tabela com `INSERT ... SELECT`
Esta é uma técnica muito poderosa para usuários intermediários. A instrução INSERT ... SELECT permite que você pegue o resultado de uma consulta SELECT de outra tabela e o insira diretamente em uma nova tabela.
Isso é extremamente útil em cenários como mover produtos de uma tabela de "lista de novidades" (new_arrivals) para a tabela principal products assim que seu lançamento for confirmado.
Primeiro, vamos criar a tabela de origem, new_arrivals, e preenchê-la com alguns dados.
-- Criar a tabela de origem
CREATE TABLE new_arrivals (
product_name TEXT NOT NULL,
product_category TEXT,
list_price INTEGER,
launch_date DATE,
is_confirmed INTEGER -- 1 se o lançamento for confirmado, 0 caso contrário
);
-- Preencher a lista de novidades
INSERT INTO new_arrivals VALUES
('Fones de Ouvido Definitivos', 'Áudio', 28000, '2025-09-01', 1),
('Óculos de RV do Futuro', 'Gadgets', 75000, '2025-10-01', 1),
('Cafeteira Totalmente Automática', 'Eletrodomésticos', 18000, '2025-09-15', 0);
Estamos prontos. Agora, vamos selecionar apenas os produtos da tabela new_arrivals que estão confirmados para lançamento (is_confirmed = 1) e adicioná-los à nossa tabela products.
INSERT INTO products (name, category, price, release_date)
SELECT product_name, product_category, list_price, launch_date
FROM new_arrivals
WHERE is_confirmed = 1;
O ponto principal desta consulta é que uma instrução SELECT é usada em vez da cláusula VALUES. A estrutura de colunas do conjunto de resultados da instrução SELECT (número de colunas, ordem e tipos de dados) deve corresponder à estrutura de colunas especificada em INSERT INTO products (...). Isso tem uma vasta gama de usos, como criar backups de dados ou salvar resultados agregados em outra tabela.
Erros Comuns de INSERT e Como Corrigi-los
A instrução INSERT retornará imediatamente um erro se você violar qualquer uma das regras (restrições) do banco de dados. Vamos ver alguns dos erros mais comuns que os iniciantes encontram, suas causas e como corrigi-los.
Erro 1: Violação de Chave Primária
Este é o erro mais comum. Uma chave primária é um identificador único dentro de uma tabela que nunca deve ser duplicado. Se você estiver especificando IDs manualmente e tentar usar um ID que já existe, receberá um erro.
Por exemplo, a "Maçã Milagrosa" com ID=1 já está registrada. Se tentarmos registrar outro produto com ID=1...
-- Isto vai causar um erro!
INSERT INTO products (id, name, category, price, release_date)
VALUES (1, 'Outra Maçã', 'Mercearia', 300, '2025-07-02');
Executar isso exibirá uma mensagem de erro como UNIQUE constraint failed: products.id ou Duplicate entry '1' for key 'PRIMARY'.
Solução: A abordagem mais segura e confiável é não gerenciar chaves primárias manualmente, mas deixar que o recurso de autoincremento do banco de dados cuide disso. Como em nosso primeiro exemplo, simplesmente omita o id da lista de colunas em sua instrução INSERT.
Erro 2: Violação da Restrição NOT NULL
Colunas especificadas com NOT NULL quando a tabela foi criada devem sempre ter um valor. Tentar inserir uma linha omitindo tal coluna resultará em um erro.
A coluna name em nossa tabela products é NOT NULL. Se tentarmos inserir sem especificar um name...
-- Isto também vai causar um erro!
INSERT INTO products (category, price)
VALUES ('Outro', 1000);
Você verá um erro como NOT NULL constraint failed: products.name.
Solução: Sempre forneça algum valor para colunas com uma restrição NOT NULL. Se você quiser permitir uma string vazia, deve especificá-la explicitamente, como ''.
Erro 3: Incompatibilidade de Tipos de Dados
Você receberá um erro se tentar inserir dados de um tipo diferente do que foi definido para a coluna. Por exemplo, tentar inserir uma string na coluna price, que é do tipo inteiro (INTEGER).
-- Isto, claro, vai causar um erro!
INSERT INTO products (name, price)
VALUES ('Pedra Cara', 'O preço é um segredo');
Isso produzirá um erro como Datatype mismatch ou Incorrect integer value: 'O preço é um segredo' for column 'price'.
Solução: Verifique a definição da sua tabela com cuidado e forneça valores do tipo de dados correto para cada coluna. Tenha cuidado com erros comuns como envolver números em aspas (por exemplo, '500'), o que os torna strings.
【Playground Interativo】Vamos Adicionar Dados Executando SQL no Navegador!
Agora é hora de transformar conhecimento em habilidade! Copie todo o código HTML abaixo, salve-o como um arquivo tipo sql_insert_test.html, e abra-o no seu navegador. Seu próprio ambiente SQL privado será iniciado, com a tabela products que criamos neste artigo pronta para usar.
Sinta-se à vontade para escrever sua própria instrução INSERT e pressionar "Executar", depois escreva SELECT * FROM products; logo abaixo e pressione "Executar" novamente para confirmar que os dados foram realmente adicionados. Causar erros intencionalmente também é uma ótima maneira de aprender!
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Playground Online da Instrução SQL INSERT</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.7; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
h1 { color: #2c3e50; }
textarea { width: 100%; height: 180px; font-family: "SF Mono", "Consolas", monospace; font-size: 16px; padding: 12px; border: 1px solid #ccc; border-radius: 6px; box-sizing: border-box; margin-bottom: 1rem; }
button { background-color: #27ae60; color: white; border: none; padding: 12px 22px; font-size: 16px; border-radius: 6px; cursor: pointer; transition: background-color 0.2s; }
button:hover { background-color: #229954; }
button:disabled { background-color: #bdc3c7; cursor: not-allowed; }
#result-container { margin-top: 2rem; border: 1px solid #ddd; padding: 1rem; border-radius: 6px; background: #fdfdfd; min-height: 50px; }
#status-message { color: #27ae60; font-weight: bold; }
#error-message { color: #e74c3c; font-weight: bold; }
table { border-collapse: collapse; width: 100%; margin-top: 1rem; }
th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
</head>
<body>
<h1>Vamos Experimentar o SQL!</h1>
<p>Digite uma instrução SQL na área de texto abaixo e clique no botão "Executar". Tente inserir um produto que você inventou!</p>
<textarea id="sql-input">-- Escreva suas instruções INSERT ou SELECT aqui
INSERT INTO products (name, category, price, release_date)
VALUES ('Cadeira Gravidade Zero', 'Móveis', 45000, '2025-11-11');
SELECT * FROM products;
</textarea>
<button id="execute-btn">Executar</button>
<div id="result-container">
<p id="status-message"></p>
<p id="error-message"></p>
<div id="result-output"></div>
</div>
<script>
const sqlInput = document.getElementById('sql-input');
const executeBtn = document.getElementById('execute-btn');
const statusMsg = document.getElementById('status-message');
const errorMsg = document.getElementById('error-message');
const resultOutput = document.getElementById('result-output');
let db;
async function initDb() {
executeBtn.disabled = true;
executeBtn.textContent = 'Inicializando BD...';
try {
const SQL = await initSqlJs({
locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
});
db = new SQL.Database();
const setupSql = `
DROP TABLE IF EXISTS products;
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
category TEXT,
price INTEGER,
release_date DATE
);
`;
db.run(setupSql);
executeBtn.disabled = false;
executeBtn.textContent = 'Executar';
statusMsg.textContent = 'Pronto! Tente adicionar dados com uma instrução INSERT e verifique o resultado com uma instrução SELECT.';
} catch (err) {
errorMsg.textContent = 'Falha ao inicializar o banco de dados: ' + err.message;
console.error(err);
}
}
function executeSql() {
if (!db) return;
const sql = sqlInput.value;
statusMsg.textContent = '';
errorMsg.textContent = '';
resultOutput.innerHTML = '';
try {
const statements = sql.split(';').filter(s => s.trim() !== '');
let lastResult;
statements.forEach(stmt => {
const trimmedStmt = stmt.trim();
if (trimmedStmt.toUpperCase().startsWith('INSERT') || trimmedStmt.toUpperCase().startsWith('UPDATE') || trimmedStmt.toUpperCase().startsWith('DELETE')) {
db.run(trimmedStmt);
const changes = db.getRowsModified();
statusMsg.innerHTML += `Consulta "${trimmedStmt.substring(0, 30)}..." executada, ${changes} linha(s) modificada(s).<br>`;
} else {
const results = db.exec(trimmedStmt);
lastResult = results;
}
});
if (lastResult && lastResult.length > 0) {
lastResult.forEach(result => {
const table = document.createElement('table');
const thead = document.createElement('thead');
const tbody = document.createElement('tbody');
const headerRow = document.createElement('tr');
result.columns.forEach(colName => {
const th = document.createElement('th');
th.textContent = colName;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(row => {
const bodyRow = document.createElement('tr');
row.forEach(cellValue => {
const td = document.createElement('td');
td.textContent = cellValue === null ? 'NULL' : cellValue;
bodyRow.appendChild(td);
});
tbody.appendChild(bodyRow);
});
table.appendChild(thead);
table.appendChild(tbody);
resultOutput.appendChild(table);
});
}
} catch (err) {
errorMsg.textContent = 'Erro de SQL: ' + err.message;
console.error(err);
}
}
executeBtn.addEventListener('click', executeSql);
initDb();
</script>
</body>
</html>
Amigos do INSERT: Operações CRUD
Agora que você aprendeu o INSERT, adquiriu um dos quatro poderes fundamentais da manipulação de banco de dados. Essas quatro operações são conhecidas pelo acrônimo CRUD e formam a base das operações de dados em todas as aplicações.
- C (Create - Criar): Criar novos dados → Instrução
INSERT(que aprendemos hoje!) - R (Read - Ler): Ler dados → Instrução
SELECT - U (Update - Atualizar): Atualizar dados existentes → Instrução
UPDATE - D (Delete - Apagar): Apagar dados existentes → Instrução
DELETE
Você já está familiarizado com o SELECT. Agora que você pode "adicionar" dados, seus próximos passos poderiam ser aprender a "atualizá-los" (UPDATE) ou "apagá-los" (DELETE), o que ampliará ainda mais o leque do que você pode fazer com um banco de dados.
Conclusão
Neste artigo, demos uma olhada detalhada na instrução INSERT para adicionar novos dados a um banco de dados, cobrindo tudo, desde o básico até aplicações avançadas e erros comuns.
- Sintaxe Básica:
INSERT INTO tabela (colunas...) VALUES (valores...);é a base de tudo. - Chaves Primárias: Configurá-las para autoincremento permite que o banco de dados gerencie IDs de forma segura e confiável.
- INSERT de Múltiplas Linhas: Encadeando várias listas de valores com vírgulas após a cláusula
VALUESpermite um registro em massa eficiente. - INSERT SELECT: Uma técnica poderosa para adicionar dados em massa de outra tabela.
- Tratamento de Erros: Os três grandes são "Violação de Chave Primária", "Violação de NOT NULL" e "Incompatibilidade de Tipos de Dados". Eles não são assustadores quando você entende a causa.
A instrução INSERT é o primeiro passo para dar vida aos seus sites e aplicações, registrando ações do usuário e enriquecendo seu conteúdo. Pratique repetidamente no playground deste artigo para se sentir à vontade adicionando dados livremente. Esta acumulação de pequenos sucessos certamente o guiará em seu caminho para se tornar um criador web de primeira linha.