🚀 Novembro começou! O SQLtest.online continua gratuito graças às doações de pessoas como você. Ajude-nos a atingir a meta deste mês mais cedo para que o site continue funcionando sem interrupções. Apoiar agora →
Código SQL copiado para a área de transferência

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.

SQL INSERT INTO: uma lista de colunas e uma lista VALUES associadas por posição, autoincremento e valores padrão para colunas omitidas, e INSERT INTO ... SELECT

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

ErroCausa
Column count doesn't match value countA lista de valores e a lista de colunas têm comprimentos diferentes
Field '…' doesn't have a default valueFoi 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 failsUma linha referenciada não existe
Incorrect … valueUm 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 NULL sem 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 ... SELECT insere o resultado de uma consulta.
  • As colunas omitidas recebem o seu valor padrão ou NULL; a palavra-chave DEFAULT pede 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.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Criar novo registro de endereço
  2. Inserir novo registro de funcionário
  3. Criar Tabela de Ilhas