Código SQL copiado para a área de transferência
RU EN FR

Lição 8.1: A Instrução INSERT INTO

Até agora, focamos em recuperar dados de tabelas existentes usando a instrução SELECT. Agora, começaremos a explorar a Linguagem de Manipulação de Dados (DML), começando por como adicionar novos dados às suas tabelas usando a instrução INSERT INTO.

Lesson illustration

A Sintaxe Básica

Existem duas formas principais de usar a instrução INSERT INTO.

1. Especificando Colunas (Recomendado)

Este é o método mais seguro e comum. Você lista explicitamente as colunas que deseja preencher, seguidas pelos valores para essas colunas.

INSERT INTO nome_da_tabela (coluna1, coluna2, coluna3)
VALUES (valor1, valor2, valor3);

2. Sem Especificar Colunas

Se você estiver fornecendo valores para todas as colunas da tabela na ordem exata em que foram definidas, poderá omitir os nomes das colunas. No entanto, isso é menos flexível e pode levar a erros se a estrutura da tabela for alterada.

INSERT INTO nome_da_tabela
VALUES (valor1, valor2, valor3, ...);

Regras Importantes para Inserção de Dados

  • Tipos de Dados: Os valores que você fornece devem corresponder ao tipo de dados da coluna correspondente (por exemplo, você não pode inserir texto em uma coluna numérica).
  • Strings e Datas: Assim como na cláusula WHERE, os valores de string (texto) e data devem estar entre aspas simples (').
  • Números: Valores numéricos não requerem aspas.
  • Valores NULL: Se uma coluna permitir NULL e você não fornecer um valor para ela, ela será preenchida com NULL (ou um valor padrão, se definido).

Exemplos

Exemplo 1: Inserindo um Novo Ator

Vamos adicionar um novo ator à tabela actor no banco de dados Sakila.

INSERT INTO actor (first_name, last_name)
VALUES ('JOHNNY', 'DEPP');

Nota: Não especificamos o actor_id porque ele geralmente é gerado automaticamente pelo banco de dados.

Exemplo 2: Inserindo em Colunas Específicas

Se tivermos uma tabela com muitas colunas, mas quisermos preencher apenas algumas:

INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('ALICE', 'JOHNSON', 'alice.j@example.com', 1, 5);

Exemplo 3: Inserção de Múltiplas Linhas

A maioria dos bancos de dados modernos permite inserir várias linhas em uma única instrução, separando os conjuntos de valores por vírgulas.

INSERT INTO actor (first_name, last_name)
VALUES 
    ('TOM', 'HANKS'),
    ('MERYL', 'STREEP'),
    ('LEONARDO', 'DICAPRIO');

Inserindo Dados de Outra Consulta (INSERT INTO ... SELECT)

Às vezes, você não precisa inserir os dados manualmente, mas sim transferi-los de uma tabela para outra (ex: durante o arquivamento ou geração de relatórios). Para isso, utiliza-se a combinação de INSERT INTO e SELECT.

Sintaxe

INSERT INTO tabela_destino (coluna1, coluna2, coluna3)
SELECT coluna_origem1, coluna_origem2, coluna_origem3
FROM tabela_origem
WHERE condicao;

Flexibilidade na Formação de Dados

Uma característica importante deste comando é que, no bloco SELECT, você pode combinar diferentes tipos de valores:

  1. Valores selecionados: diretamente da tabela de origem (coluna_origem1).
  2. Valores calculados: resultado de fórmulas ou funções (ex: amount * 0.1).
  3. Valores constantes: dados fixos que não estão na tabela de origem (ex: data de inserção ou um status como uma string).

Exemplo: Criando um Arquivo de Clientes Inativos

Suponha que tenhamos uma tabela customer_archive e queiramos transferir dados para lá a partir da tabela principal customer, adicionando a data de arquivamento e uma nota de status:

INSERT INTO customer_archive (customer_id, full_name, archived_at, status_note)
SELECT 
    customer_id, 
    CONCAT(first_name, ' ', last_name), -- Valor calculado (Nome Completo)
    CURRENT_DATE,                       -- Constante (data atual)
    'Auto-archived'                     -- Constante (etiqueta de texto)
FROM customer
WHERE active = 0;

Nota: O número e a ordem das colunas em INSERT INTO devem corresponder estritamente ao número e à ordem das colunas retornadas no SELECT.


Trabalhando com NULL e Valores Padrão

Ao inserir uma linha, nem sempre é necessário fornecer um valor para cada coluna. O banco de dados lida com valores ausentes de duas formas: através de NULL e através de valores padrão das colunas.

Inserindo NULL Explicitamente

Se uma coluna permite NULL, você pode passar a palavra-chave NULL diretamente como valor:

INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('BOB', 'SMITH', NULL, 1, 5);

Aqui, a coluna email será armazenada como NULL, significando "nenhum valor conhecido".

Usando Valores Padrão da Coluna

Se uma coluna tiver um valor DEFAULT definido no esquema da tabela, você pode omiti-la completamente da lista de colunas. O banco de dados a preencherá automaticamente:

INSERT INTO actor (first_name, last_name)
VALUES ('CATE', 'BLANCHETT');

Colunas como actor_id (auto-incremento) e last_update (timestamp padrão) são preenchidas pelo banco de dados sem nenhuma entrada explícita.

Usando DEFAULT Explicitamente

Você também pode usar a palavra-chave DEFAULT para acionar o valor padrão de uma coluna, mantendo-a na lista:

INSERT INTO actor (actor_id, first_name, last_name, last_update)
VALUES (DEFAULT, 'CATE', 'BLANCHETT', DEFAULT);

Isso é útil quando sua instrução lista todas as colunas, mas você ainda deseja que o banco de dados cuide de algumas delas.


Principais Conclusões desta Lição:

  • A instrução INSERT INTO é usada para adicionar novas linhas a uma tabela.
  • O comando INSERT INTO ... SELECT permite copiar dados de uma tabela para outra.
  • No bloco SELECT, você pode combinar dados reais da tabela, campos calculados e constantes.
  • Listar explicitamente os nomes das colunas é recomendado para melhor confiabilidade e legibilidade do código.
  • Valores de string e data devem estar entre aspas simples.
  • Você pode inserir várias linhas de uma só vez para melhorar o desempenho.
  • Colunas com NULL ou valor DEFAULT podem ser omitidas ou passadas explicitamente usando as palavras-chave NULL e DEFAULT.

Na próxima lição, veremos como modificar registros existentes usando a instrução UPDATE.