SQL INSERT INTO: Adicionar Linhas a uma Tabela
Lição 8.1 · Tempo de leitura: ~7 min · Tarefas para praticar ↓
A instrução SQL INSERT INTO adiciona novas linhas a uma tabela. Nesta lição, você vai aprender a sintaxe do INSERT, por que listar sempre as colunas, como inserir várias linhas de uma vez, como copiar dados com INSERT INTO ... SELECT e como são preenchidas as colunas com NULL, DEFAULT e autoincremento.
Até agora, todas as consultas deste curso leram dados com SELECT. Com este módulo, você começa a alterar dados. INSERT, UPDATE e DELETE formam a Linguagem de Manipulação de Dados (DML); o INSERT é o que cria novas linhas.
Os bancos de exemplo do SQLtest são somente leitura, por isso estas instruções devolvem ali um erro de permissão. Os exemplos usam o esquema Sakila para mostrar a sintaxe e as regras que um banco de dados real aplica.
Sintaxe do INSERT
Com Lista de Colunas (Recomendado)
INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);
Os valores são associados às colunas por posição: o primeiro valor vai para a primeira coluna listada, e assim por diante. As colunas que não estão na lista recebem o seu valor padrão ou NULL.
Sem Lista de Colunas
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
Aqui é preciso dar um valor para cada coluna, na ordem em que as colunas foram definidas na tabela. Se alguém adicionar uma coluna mais tarde, a instrução falha ou, pior, coloca valores nas colunas erradas. Liste sempre as colunas em código que é guardado e reutilizado.
Inserir uma Linha
INSERT INTO actor (first_name, last_name)
VALUES ('JOHNNY', 'DEPP');
Resultado: um novo ator. actor_id é preenchido automaticamente (autoincremento), e last_update recebe a hora atual a partir do seu valor padrão.
As regras para os valores são as mesmas do WHERE: texto e datas entre aspas simples, números sem aspas.
Colunas Obrigatórias
Uma coluna definida como NOT NULL sem valor padrão tem de receber um valor. No Sakila, customer.create_date é uma coluna assim:
-- Erro: Field 'create_date' doesn't have a default value
INSERT INTO customer (store_id, first_name, last_name, email, address_id)
VALUES (1, 'ALICE', 'JOHNSON', 'alice.j@example.com', 5);
-- Correto: a coluna obrigatória tem um valor
INSERT INTO customer (store_id, first_name, last_name, email, address_id, create_date)
VALUES (1, 'ALICE', 'JOHNSON', 'alice.j@example.com', 5, NOW());
Resultado: um novo cliente da loja 1. customer_id é gerado, e active recebe o seu valor padrão 1.
Os valores também têm de respeitar as chaves estrangeiras: store_id = 1 e address_id = 5 têm de existir nas tabelas store e address; caso contrário, o banco de dados rejeita a linha.
Inserir Várias Linhas
Várias listas de valores separadas por vírgulas inserem várias linhas numa só instrução:
INSERT INTO actor (first_name, last_name)
VALUES ('TOM', 'HANKS'),
('MERYL', 'STREEP'),
('LEONARDO', 'DICAPRIO');
Resultado: três novos atores.
Uma instrução com várias linhas é muito mais rápida do que várias instruções de uma linha: o banco de dados analisa-a uma vez e grava as alterações de uma só vez. É a forma padrão de carregar dados em lotes.
Valores NULL e DEFAULT
NULL grava "sem valor" numa coluna que o permite:
INSERT INTO customer (store_id, first_name, last_name, email, address_id, create_date)
VALUES (1, 'BOB', 'SMITH', NULL, 5, NOW());
Resultado: um cliente sem endereço de e-mail.
Omitir uma coluna preenche-a com o seu valor padrão, ou NULL se não houver valor padrão.
DEFAULT pede o valor padrão de forma explícita, o que é útil quando todas as colunas estão listadas:
INSERT INTO actor (actor_id, first_name, last_name, last_update)
VALUES (DEFAULT, 'CATE', 'BLANCHETT', DEFAULT);
Resultado: actor_id recebe o próximo número de autoincremento, e last_update a hora atual.
INSERT INTO ... SELECT
Em vez de VALUES, um INSERT pode obter as suas linhas a partir de uma consulta. É assim que se copiam dados entre tabelas, se arquiva ou se carregam tabelas de relatório:
INSERT INTO target_table (column1, column2, column3)
SELECT source_column1, source_column2, source_column3
FROM source_table
WHERE condition;
A lista do SELECT pode combinar colunas, cálculos e constantes. Por exemplo, se existir uma tabela customer_archive, os clientes inativos podem ser copiados para ela:
INSERT INTO customer_archive (customer_id, full_name, archived_at, status_note)
SELECT customer_id,
CONCAT(first_name, ' ', last_name),
CURRENT_DATE,
'Auto-archived'
FROM customer
WHERE active = 0;
Resultado: 15 linhas, uma por cliente inativo, com o nome completo, a data de hoje e uma nota fixa.
O número e a ordem das colunas do SELECT têm de corresponder à lista de colunas do INSERT. Os nomes das colunas não precisam corresponder; as posições, sim.
Erros Comuns de INSERT
| Erro | Causa |
|---|---|
| Column count doesn't match value count | A lista de valores e a lista de colunas têm comprimentos diferentes |
| Field '…' doesn't have a default value | Foi omitida uma coluna NOT NULL sem valor padrão |
| Duplicate entry '…' for key 'PRIMARY' | O valor da chave já existe |
| Cannot add or update a child row: a foreign key constraint fails | Uma linha referenciada não existe |
| Incorrect … value | Um valor não serve para o tipo de dados da coluna |
Principais conclusões:
INSERT INTO table (columns) VALUES (values)adiciona uma linha; os valores correspondem às colunas por posição.- Liste sempre as colunas: assim a instrução sobrevive a mudanças na tabela.
- Colunas
NOT NULLsem valor padrão têm de receber um valor; as chaves estrangeiras têm de apontar para linhas existentes. - Uma instrução pode inserir muitas linhas:
VALUES (...), (...), (...). INSERT INTO ... SELECTinsere o resultado de uma consulta.- As colunas omitidas recebem o seu valor padrão ou
NULL; a palavra-chaveDEFAULTpede o valor padrão de forma explícita.
Perguntas Frequentes
Como inserir várias linhas em SQL?
Liste vários grupos de valores depois de VALUES, separados por vírgulas: INSERT INTO actor (first_name, last_name) VALUES ('TOM', 'HANKS'), ('MERYL', 'STREEP');. Funciona no MySQL, MariaDB, PostgreSQL, SQL Server e SQLite.
Como copiar linhas de uma tabela para outra?
Use INSERT INTO target (columns) SELECT columns FROM source WHERE condition;. O SELECT tem de devolver o mesmo número de colunas, na mesma ordem, que a lista de colunas da tabela de destino.
O que acontece às colunas que eu não listo no INSERT?
Recebem o seu valor padrão. Uma chave de autoincremento recebe o próximo número. Se uma coluna não tiver valor padrão, recebe NULL, ou a instrução falha se a coluna for NOT NULL.