

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

Inserta filas nuevas en una tabla de destino en función de una instrucción de consulta `SELECT` que se ejecuta en una tabla de origen o en función de un conjunto de `VALUES` proporcionados como parte de la instrucción. Cuando la tabla de origen se basa en datos subyacentes con un formato concreto, como CSV o JSON, y la tabla de destino emplea otro formato, como Parquet u ORC, puede utilizar consultas `INSERT INTO` para transformar los datos seleccionados en el formato de la tabla de destino. 

## Consideraciones y limitaciones
<a name="insert-into-limitations"></a>

Cuando utilice las consultas `INSERT` con Athena, tenga en cuenta lo siguiente.
+ De forma predeterminada, cuando se ejecuta una consulta `INSERT` en una tabla con datos subyacentes cifrados en Amazon S3, los archivos de salida que escribe la consulta `INSERT` no se cifran. Le recomendamos que cifre los resultados de las consultas `INSERT` si se van a insertar en tablas con datos cifrados. 

  Para obtener más información acerca cómo cifrar los resultados de las consultas utilizando la consola, consulte [Cifrado de los resultados de las consultas de Athena en Amazon S3](encrypting-query-results-stored-in-s3.md). Para habilitar el cifrado mediante la AWS CLI o la API de Athena, utilice las propiedades `EncryptionConfiguration` de la acción [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) para especificar las opciones de cifrado de Amazon S3 en función de sus necesidades.
+ Para las instrucciones `INSERT INTO`, la configuración del propietario del bucket esperado no se aplica a la ubicación de la tabla de destino en Amazon S3. La configuración del propietario esperado del bucket se aplica solo a la ubicación de salida de Amazon S3 especificada para los resultados de las consultas de Athena. Para obtener más información, consulte [Especificación de una ubicación de resultados de consulta mediante la consola de Athena](query-results-specify-location-console.md).
+ En relación con las instrucciones `INSERT INTO` que cumplen con los requisitos de ACID, consulte la sección `INSERT INTO` de [Actualización de los datos de las tablas de Iceberg](querying-iceberg-updating-iceberg-table-data.md).

### Formatos y SerDes compatibles
<a name="insert-into-supported-formats"></a>

Puede ejecutar una consulta `INSERT` en las tablas creadas a partir de datos con los siguientes formatos y SerDes.


| Formato de los datos | 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  | 
|  Archivo de texto  |  org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  Se admiten archivos TSV y con delimitadores personalizados.   | 
| CSV | org.apache.hadoop.hive.serde2.OpenCSVSerde Las escrituras solo son compatibles con tipos de datos de cadena. Desde Athena, no se puede escribir en tablas cuyo esquema de Glue contenga tipos de datos que no sean de cadena. Para obtener más información, consulte [CSV SerDe](csv-serde.md#csv-serde-opencsvserde-considerations-non-string).  | 

### No se admiten tablas en buckets.
<a name="insert-into-bucketed-tables-not-supported"></a>

`INSERT INTO` no es compatible con las tablas en buckets. Para obtener más información, consulte [Uso de particiones y asignación de buckets](ctas-partitioning-and-bucketing.md).

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

`INSERT INTO` no es compatible con las consultas federadas. Si intenta hacerlo, puede aparecer el mensaje de error This operation is currently not supported for external catalogs (Esta operación no es compatible actualmente con catálogos externos). Para obtener información sobre las consultas federadas, consulte [Uso de consulta federada de Amazon Athena](federated-queries.md).

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

Tenga en cuenta los puntos de esta sección al utilizar particiones con consultas `INSERT INTO` o `CREATE TABLE AS SELECT`.

#### Límites
<a name="insert-into-partition-limits"></a>

La instrucción `INSERT INTO` admite escribir un máximo de 100 particiones en la tabla de destino. Si ejecuta la cláusula `SELECT` en una tabla con más de 100 particiones, se produce un error en la consulta a menos que la consulta `SELECT` esté limitada a 100 particiones o menos.

Para obtener más información sobre cómo evitar esta limitación, consulte [Uso de CTAS e INSERT INTO para evitar el límite de 100 particiones](ctas-insert-into.md).

#### Ordenamiento de columnas
<a name="insert-into-partition-detection"></a>

Las instrucciones `INSERT INTO` o `CREATE TABLE AS SELECT` esperan que la columna particionada sea la última de la lista de columnas proyectadas en una instrucción `SELECT`. 

Si la tabla de origen no está particionada o está particionada en columnas diferentes en comparación con la tabla de destino, las consultas como `INSERT INTO destination_table SELECT * FROM source_table` consideran que los valores de la última columna de la tabla de origen son valores para una columna de partición en la tabla de destino. Tenga esto en cuenta al intentar crear una tabla particionada desde una tabla no particionada.

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

Para obtener más información acerca del uso de `INSERT INTO` con la partición, consulte los siguientes recursos.
+ Para insertar datos particionados en una tabla particionada, consulte [Uso de CTAS e INSERT INTO para evitar el límite de 100 particiones](ctas-insert-into.md).
+ Para insertar datos no particionados en una tabla particionada, consulte [Uso de CTAS e INSERT INTO en ETL y análisis de datos](ctas-insert-into-etl.md). 

### Archivos escritos en Simple Storage Service (Amazon S3)
<a name="insert-into-files-written-to-s3"></a>

Tras ejecutar el comando `INSERT`, Athena escribe archivos en las ubicaciones de datos de origen de Amazon S3. Cada operación `INSERT` crea un nuevo archivo, en lugar de anexar el resultado a un archivo existente. Las ubicaciones de los archivos dependen de la estructura de la tabla y la consulta `SELECT`, si procede. Athena genera un archivo de manifiesto de datos para cada consulta `INSERT`. El manifiesto realiza un seguimiento de los archivos que escribió la consulta. Se guarda en la ubicación del resultado de la consulta de Athena en Amazon S3. Para obtener más información, consulte [Identificación de archivos de salida de consultas](querying-finding-output-files.md#querying-identifying-output-files).

### Evite las actualizaciones altamente transaccionales
<a name="insert-into-transactional-caveat"></a>

Cuando utiliza `INSERT INTO` para añadir filas a una tabla en Amazon S3, Athena no reescribe ni modifica los archivos existentes. En su lugar, escribe las filas como uno o más archivos nuevos. Dado que las tablas con [ muchos archivos pequeños reducen el rendimiento de las consultas](performance-tuning-data-optimization-techniques.md#performance-tuning-avoid-having-too-many-files) y que las operaciones de escritura lectura, como `PutObject` y `GetObject`, generan costes más altos de Amazon S3, tenga en cuenta las siguientes opciones cuando utiliza `INSERT INTO`:
+ Ejecute las operaciones `INSERT INTO` con menos frecuencia en lotes más grandes de filas.
+ Para grandes volúmenes de ingesta de datos, considere la posibilidad de utilizar un servicio como [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html).
+ Evite por completo el uso de `INSERT INTO`. En su lugar, acumule filas en archivos más grandes y cárguelos directamente en Amazon S3, donde Athena podrá consultarlos.

### Localización de archivos huérfanos
<a name="insert-into-files-partial-data"></a>

Si una instrucción `CTAS` o `INSERT INTO` falla, los datos huérfanos se pueden dejar en la ubicación de los datos y se pueden leer en consultas posteriores. Para localizar archivos huérfanos para su inspección o eliminación, puede utilizar el archivo de manifiesto de datos que Athena proporciona para realizar un seguimiento de la lista de archivos que se van a escribir. Para obtener más información, consulte [Identificación de archivos de salida de consultas](querying-finding-output-files.md#querying-identifying-output-files) y [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 la consulta que se va a ejecutar en una tabla, `source_table`, lo que determina las filas que se van a insertar en una segunda tabla, `destination_table`. Si la consulta `SELECT` especifica columnas de `source_table`, las columnas deben coincidir exactamente con las de `destination_table`.

Para obtener más información acerca de las consultas `SELECT`, consulte [SELECT](select.md).

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

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

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

Seleccione todas las filas de la tabla `vancouver_pageviews` e insértelas en la tabla `canada_pageviews`:

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

Seleccione solo las filas de la tabla `vancouver_pageviews` en las que la columna `date` tiene un valor comprendido entre `2019-07-01` y `2019-07-31`. Después, insértelas en `canada_july_pageviews`:

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

En la tabla `city`, seleccione los valores de las columnas `state` y `cities_world` de aquellas filas que tengan el valor `usa` en la columna `country` e insértelos en las columnas `city` y `state` de la tabla `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>

Inserta filas en una tabla existente especificando columnas y valores. Las columnas especificadas y los tipos de datos asociados deben coincidir exactamente con las columnas y los tipos de datos de la tabla de destino.

**importante**  
No es recomendable utilizar `VALUES` para insertar las filas, ya que Athena genera archivos con cada operación `INSERT`. Esto puede provocar que se creen muchos archivos pequeños y reducir el rendimiento de las consultas de la tabla. Para identificar los archivos que crea una consulta `INSERT`, examine el archivo del manifiesto de datos. Para obtener más información, consulte [Trabajo con resultados de la consulta y consultas recientes](querying.md).

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

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

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

En los siguientes ejemplos, la tabla de ciudades tiene varias columnas: , , y: `id`, `city`, `state`, `state_motto`. La columna `id` es de tipo `INT`, mientras que todas las demás columnas son de tipo `VARCHAR`.

Inserte una sola fila en la tabla `cities` con todos los valores de columna especificados:

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

Inserte dos filas en la tabla `cities`:

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