

# INSERT INTO
<a name="insert-into"></a>

Insere novas linhas em uma tabela de destino com base em uma instrução de consulta `SELECT` executada em uma tabela de origem ou com base em um conjunto de `VALUES` fornecidos como parte da instrução. Quando a tabela de origem é baseada em dados subjacentes em um formato, como CSV ou JSON, e a tabela de destino é baseada em outro formato, como Parquet ou ORC, você pode usar as consultas `INSERT INTO` para transformar os dados selecionados no formato da tabela de destino. 

## Considerações e limitações
<a name="insert-into-limitations"></a>

Considere o seguinte ao usar as consultas `INSERT` com o Athena.
+ Ao executar uma consulta `INSERT` em uma tabela com dados subjacentes criptografados no Amazon S3, os arquivos de saída que a consulta `INSERT` grava não são criptografados por padrão. Recomendamos que você criptografe os resultados da consulta `INSERT` se estiver inserindo em tabelas com dados criptografados. 

  Para obter mais informações sobre como criptografar resultados da consulta usando o console, consulte [Criptografar os resultados de consultas do Athena armazenados no Amazon S3](encrypting-query-results-stored-in-s3.md). Para habilitar a criptografia usando a AWS CLI ou a API do Athena, use as propriedades `EncryptionConfiguration` da ação [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) para especificar as opções de criptografia do Amazon S3 de acordo com os seus requisitos.
+ Para instruções `INSERT INTO`, a configuração do proprietário do bucket esperado não se aplica ao local da tabela de destino no Amazon S3. A configuração esperada do proprietário do bucket se aplica somente ao local de saída do Amazon S3 que você especificar para os resultados da consulta do Athena. Para obter mais informações, consulte [Especificar um local para resultados de consultas com uso do console do Athena](query-results-specify-location-console.md).
+ Para obter instruções `INSERT INTO` em conformidade com ACID, consulte a seção `INSERT INTO` em [Atualizar dados nas tabelas do Iceberg](querying-iceberg-updating-iceberg-table-data.md).

### Formatos compatíveis e SerDes
<a name="insert-into-supported-formats"></a>

É possível executar uma consulta `INSERT` em tabelas criadas de dados com os seguintes formatos e SerDes.


| Formato de dados | SerDe | 
| --- | --- | 
|  Avro  |  org.apache.hadoop.hive.serde2.avro.AvroSerDe  | 
| Ion | com.amazon.ionhiveserde.IonHiveSerDe | 
|  JSON  |  org.apache.hive.hcatalog.data.JsonSerDe  | 
|  ORC  |  org.apache.hadoop.hive.ql.io.orc.OrcSerde  | 
|  Parquet  |  org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe  | 
|  Arquivo de texto  |  org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  Há suporte a arquivos TSV e delimitados personalizados.   | 
| CSV | org.apache.hadoop.hive.serde2.OpenCSVSerde Há suporte a operações de escrita somente em tipos string. No Athena, não é possível escrever em tabelas que contêm tipos não string no esquema do Glue. Para obter mais informações, consulte [CSV SerDe](csv-serde.md#csv-serde-opencsvserde-considerations-non-string).  | 

### Tabelas em bucket sem suporte
<a name="insert-into-bucketed-tables-not-supported"></a>

`INSERT INTO` não é compatível com tabelas em bucket. Para obter mais informações, consulte [Usar particionamento e bucketing](ctas-partitioning-and-bucketing.md).

### Consultas federadas sem suporte
<a name="insert-into-federated-queries-not-supported"></a>

`INSERT INTO` não é suportado para consultas federadas. Tentar fazer isso pode gerar a mensagem de erro: This operation is currently not supported for external catalogs (Atualmente, esta operação não é suportada para catálogos externos). Para obter informações sobre consultas federadas, consulte [Usar a consulta federada do Amazon Athena](federated-queries.md).

### Particionamento
<a name="insert-into-limitations-partitioning"></a>

Considere os pontos desta seção ao usar o particionamento com as consultas `INSERT INTO` ou `CREATE TABLE AS SELECT`.

#### Limites
<a name="insert-into-partition-limits"></a>

A instrução `INSERT INTO` comporta a gravação de no máximo 100 combinações de partições na tabela de destino. Se você executar a cláusula `SELECT` em uma tabela com mais de 100 partições, a consulta falhará a menos que a consulta `SELECT` seja limitada a 100 partições ou menos.

Para obter informações sobre como contornar essa limitação, consulte [Usar CTAS e INSERT INTO para resolver o limite de 100 partições](ctas-insert-into.md).

#### Ordem das colunas
<a name="insert-into-partition-detection"></a>

As instruções `INSERT INTO` ou `CREATE TABLE AS SELECT` esperam que a coluna particionada seja a última na lista de colunas projetadas em uma instrução `SELECT`. 

Se a tabela de origem não for particionada ou for particionada em colunas diferentes em comparação com a tabela de destino, as consultas como `INSERT INTO destination_table SELECT * FROM source_table` vão considerar os valores na última coluna da tabela de origem como os valores de uma coluna de partição na tabela de destino. Tenha isso em mente ao tentar criar uma tabela particionada com base em uma tabela não particionada.

#### Recursos
<a name="insert-into-partition-resources"></a>

Para obter mais informações sobre como usar `INSERT INTO` com particionamento, consulte os recursos abaixo.
+ Para inserir dados particionados em uma tabela particionada, consulte [Usar CTAS e INSERT INTO para resolver o limite de 100 partições](ctas-insert-into.md).
+ Para inserir dados não particionados em uma tabela particionada, consulte [Usar CTAS e INSERT INTO para ETL e análise de dados](ctas-insert-into-etl.md). 

### Arquivos gravados no Amazon S3
<a name="insert-into-files-written-to-s3"></a>

O Athena grava arquivos nos locais dos dados de origem no Amazon S3 como resultado do comando `INSERT`. Cada operação `INSERT` cria um novo arquivo, em vez de anexar a um arquivo existente. Os locais de arquivos dependem da estrutura da tabela e da consulta `SELECT`, se houver. O Athena gera um arquivo manifesto de dados para cada consulta `INSERT`. O manifesto rastreia os arquivos que a consulta gravou. Ele é salvo no local dos resultados das consultas do Athena no Amazon S3. Para obter mais informações, consulte [Identificar arquivos de saída de consultas](querying-finding-output-files.md#querying-identifying-output-files).

### Evitar atualizações altamente transacionais
<a name="insert-into-transactional-caveat"></a>

Quando você usa `INSERT INTO` para adicionar linhas a uma tabela no Amazon S3, o Athena não reescreve nem modifica arquivos existentes. Em vez disso, ele grava as linhas como um ou mais novos arquivos. Como tabelas com [muitos arquivos pequenos resultam em desempenho inferior de consultas](performance-tuning-data-optimization-techniques.md#performance-tuning-avoid-having-too-many-files), e operações de gravação e leitura, como `PutObject` e `GetObject`, resultam em custos mais altos no Amazon S3, considere as seguintes opções ao usar `INSERT INTO`:
+ Execute operações `INSERT INTO` com menor frequência em lotes maiores de linhas.
+ Para grandes volumes de ingestão de dados, considere usar um serviço como o [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html).
+ Evite completamente o uso de `INSERT INTO`. Em vez disso, acumule linhas em arquivos maiores e faça o upload deles diretamente para o Amazon S3, onde poderão ser consultados pelo Athena.

### Localizar arquivos órfãos
<a name="insert-into-files-partial-data"></a>

Se uma instrução `INSERT INTO` ou `CTAS` falhar, os dados órfãos poderão ser deixados no local de dados e ser lidos em consultas subsequentes. Para localizar arquivos órfãos para inspeção ou exclusão, é possível usar o arquivo do manifesto de dados que o Athena oferece para rastrear a lista de arquivos a serem gravados. Para obter mais informações, consulte [Identificar arquivos de saída de consultas](querying-finding-output-files.md#querying-identifying-output-files) e [DataManifestLocation](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionStatistics.html#athena-Type-QueryExecutionStatistics-DataManifestLocation).

## INSERT INTO...SELECT
<a name="insert-into-select"></a>

Especifica a consulta a ser executada em uma tabela, `source_table`, que determina as linhas a serem inseridas em uma segunda tabela, `destination_table`. Se a consulta `SELECT` especificar colunas na `source_table`, as colunas deverão corresponder precisamente àquelas na `destination_table`.

Para obter mais informações sobre consultas `SELECT`, consulte [SELECT](select.md).

### Resumo
<a name="insert-into-select-synopsis"></a>

```
INSERT INTO destination_table 
SELECT select_query 
FROM source_table_or_view
```

### Exemplos
<a name="insert-into-select-examples"></a>

Selecione todas as linhas na tabela `vancouver_pageviews` e insira-as na tabela `canada_pageviews`:

```
INSERT INTO canada_pageviews 
SELECT * 
FROM vancouver_pageviews;
```

Selecione apenas as linhas na tabela `vancouver_pageviews` em que a coluna `date` tenha um valor entre `2019-07-01` e `2019-07-31`, e insira-as em `canada_july_pageviews`:

```
INSERT INTO canada_july_pageviews
SELECT *
FROM vancouver_pageviews
WHERE date
    BETWEEN date '2019-07-01'
        AND '2019-07-31';
```

Selecione os valores nas colunas `city` e `state` na tabela `cities_world` somente dessas linhas com um valor `usa` na coluna `country` e insira-os nas colunas `city` e `state` na tabela `cities_usa`:

```
INSERT INTO cities_usa (city,state)
SELECT city,state
FROM cities_world
    WHERE country='usa'
```

## INSERT INTO...VALUES
<a name="insert-into-values"></a>

Insere linhas em uma tabela existente especificando colunas e valores. As colunas especificadas e os tipos de dados associados devem corresponder precisamente às colunas e aos tipos de dados na tabela de destino.

**Importante**  
Não recomendamos inserir linhas com `VALUES` porque o Athena gera arquivos para cada operação `INSERT`. Isso pode fazer com que muitos arquivos pequenos sejam criados e degradem a performance de consulta da tabela. Para identificar arquivos que uma consulta `INSERT` cria, examine o arquivo manifesto de dados. Para obter mais informações, consulte [Trabalhar com resultados de consultas e consultas recentes](querying.md).

### Resumo
<a name="insert-into-values-synopsis"></a>

```
INSERT INTO destination_table [(col1,col2,...)] 
VALUES (col1value,col2value,...)[,
       (col1value,col2value,...)][,
       ...]
```

### Exemplos
<a name="insert-into-values-examples"></a>

Nos exemplos a seguir, a tabela de cidades tem três colunas: `id`, `city`, `state`, `state_motto`. A coluna `id` é do tipo `INT`, e todas as outras colunas são do tipo `VARCHAR`.

Insira uma única linha na tabela `cities`, com todos os valores da coluna especificados:

```
INSERT INTO cities 
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')
```

Insira duas linhas na tabela `cities`:

```
INSERT INTO cities 
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'),
       (3,'Boise','ID','Esto perpetua')
```