

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

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

Insère de nouvelles lignes dans une table de destination en fonction d'une instruction de requête `SELECT` qui s'exécute sur une table source, ou en fonction d'un ensemble de `VALUES` fourni dans le cadre de l'instruction. Lorsque la table source est basée sur des données sous-jacentes dans un format tel que CSV ou JSON, et que la table de destination est basée sur un autre format, comme Parquet ou ORC, vous pouvez utiliser les requêtes `INSERT INTO` pour transformer les données sélectionnées au format de la table de destination. 

## Considérations et restrictions
<a name="insert-into-limitations"></a>

Tenez compte des points suivants lorsque vous utilisez des requêtes `INSERT` avec Athena.
+ Lors de l'exécution d'une requête `INSERT` sur une table avec des données sous-jacentes chiffrées dans Simple Storage Service (Amazon S3), les fichiers de sortie écrit par la requête `INSERT` ne sont pas chiffrés par défaut. Nous vous recommandons de chiffrer les résultats de la requête `INSERT` si vous les insérez dans des tables avec des données chiffrées. 

  Pour plus d'informations sur le chiffrement des résultats de requête à l'aide de la console, consultez [Chiffrement des résultats de requêtes Athena stockés dans Amazon S3](encrypting-query-results-stored-in-s3.md). Pour activer le chiffrement à l'aide de l'API AWS CLI ou Athena, utilisez les `EncryptionConfiguration` propriétés de l'[StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html)action pour spécifier les options de chiffrement Amazon S3 en fonction de vos besoins.
+ Pour les instructions `INSERT INTO`, le paramètre de propriétaire du compartiment attendu ne s'applique pas à l'emplacement de la table de destination dans Simple Storage Service (Amazon S3). Le paramètre de propriétaire du compartiment attendu s'applique uniquement à l'emplacement de sortie Simple Storage Service (Amazon S3) que vous spécifiez pour les résultats de la requête Athena. Pour de plus amples informations, veuillez consulter [Spécification d’un emplacement de résultats des requêtes à l’aide de la console Athena](query-results-specify-location-console.md).
+ Pour les instructions `INSERT INTO` conformes à la norme ACID, voir la rubrique `INSERT INTO` de [Mise à jour des données de tables Iceberg](querying-iceberg-updating-iceberg-table-data.md).

### Formats pris en charge et SerDes
<a name="insert-into-supported-formats"></a>

Vous pouvez exécuter une `INSERT` requête sur des tables créées à partir de données aux formats suivants et SerDes.


| Format de données | 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  | 
|  Fichier texte  |  org.apache.hadoop.hive.serde2.lazy. LazySimpleSerDe  Les fichiers TSV et les fichiers avec séparateur personnalisé sont pris en charge.   | 
| CSV | org.apache.hadoop.hive.serde2.ouvrir CSVSerde L’écriture est uniquement prise en charge dans le cadre de types qui sont des chaînes. Depuis Athena, vous ne pouvez pas écrire dans des tables contenant des types qui ne sont pas des chaînes au sein d’un schéma Glue. Pour plus d'informations, voir [CSV SerDe](csv-serde.md#csv-serde-opencsvserde-considerations-non-string).  | 

### Tables compartimentées non prises en charge
<a name="insert-into-bucketed-tables-not-supported"></a>

`INSERT INTO` n'est pas pris en charge sur les tables compartimentées. Pour de plus amples informations, veuillez consulter [Utilisation du partitionnement et de la compartimentation](ctas-partitioning-and-bucketing.md).

### Requêtes fédérées non prises en charge
<a name="insert-into-federated-queries-not-supported"></a>

`INSERT INTO` n'est pas supporté pour les requêtes fédérées. Si vous tentez de le faire, le message d'erreur suivant peut s'afficher : This operation is currently not supported for external catalogs (Cette opération n'est actuellement pas prise en charge pour les catalogues externes). Pour plus d'informations sur les requêtes fédérées, consultez [Utilisation de la requête fédérée Amazon Athena](federated-queries.md).

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

Tenez compte des points de cette section lorsque vous utilisez le partitionnement avec des requêtes `INSERT INTO` ou `CREATE TABLE AS SELECT`.

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

L'instruction `INSERT INTO` prend en charge l'écriture de 100 partitions au maximum dans la table de destination. Si vous exécutez la clause `SELECT` sur une table avec plus de 100 partitions, la requête échoue sauf si la requête `SELECT` est limitée à 100 partitions ou moins.

Pour plus d'informations sur le contournement de cette limitation, consultez [Utilisation de CTAS et INSERT INTO pour contourner la limite de 100 partitions](ctas-insert-into.md).

#### Ordre des colonnes
<a name="insert-into-partition-detection"></a>

Les instructions `INSERT INTO` ou `CREATE TABLE AS SELECT` s'attendent à ce que la colonne partitionnée soit la dernière colonne de la liste des colonnes projetées dans une instruction `SELECT`. 

Si la table source n'est pas partitionnée, ou si elle est partitionnée sur différentes colonnes par rapport à la table de destination, les requêtes comme `INSERT INTO destination_table SELECT * FROM source_table` considèrent les valeurs de la dernière colonne de la table source comme des valeurs pour une colonne de partition dans la table de destination. Gardez ceci à l'esprit lorsque vous essayez de créer une table partitionnée à partir d'une table non partitionnée.

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

Pour plus d'informations sur l'utilisation de `INSERT INTO` avec le partitionnement, consultez les ressources suivantes.
+ Pour insérer des données partitionnées dans une table partitionnée, voir [Utilisation de CTAS et INSERT INTO pour contourner la limite de 100 partitions](ctas-insert-into.md).
+ Pour insérer des données non partitionnées dans une table partitionnée, voir [Utilisation de CTAS et INSERT INTO pour les opérations ETL et l’analyse des données](ctas-insert-into-etl.md). 

### Fichiers écrits dans Simple Storage Service (Amazon S3)
<a name="insert-into-files-written-to-s3"></a>

Athena écrit des fichiers dans des emplacements de données source dans Simple Storage Service (Amazon S3) comme résultat de la commande `INSERT`. Chaque opération `INSERT` crée un nouveau fichier, plutôt que d'ajouter à un fichier existant. L'emplacement des fichiers dépend de la structure de la table et de la requête `SELECT`, si elle est présente. Athena génère un fichier manifeste de données pour chaque requête `INSERT`. Le manifeste suit les fichiers écrits par la requête. Il est enregistré dans l'emplacement des résultats de requête Athena dans Simple Storage Service (Amazon S3). Pour de plus amples informations, veuillez consulter [Identification des fichiers de sortie de requête](querying-finding-output-files.md#querying-identifying-output-files).

### Contournement des mises à jour hautement transactionnelles
<a name="insert-into-transactional-caveat"></a>

Lorsque vous utilisez `INSERT INTO` pour ajouter des lignes à une table dans Amazon S3, Athena ne réécrit ni ne modifie les fichiers existants. Au lieu de cela, Athena écrit les lignes dans un ou plusieurs nouveaux fichiers. Néanmoins, les tables contenant [de nombreux petits fichiers réduisent les performances des requêtes](performance-tuning-data-optimization-techniques.md#performance-tuning-avoid-having-too-many-files) et les opérations d’écriture et de lecture comme `PutObject` et `GetObject` entraînent des coûts plus élevés dans Amazon S3. Il convient donc d’envisager les options suivantes lors de l’utilisation de `INSERT INTO` :
+ Exécutez des opérations `INSERT INTO` de façon moins fréquente sur des lots de lignes plus importants.
+ Dans le cadre de volumes d’ingestion de données importants, pensez à utiliser un service comme [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html).
+ Évitez tout simplement d’utiliser `INSERT INTO`. Accumulez plutôt les lignes dans des fichiers plus volumineux et chargez-les directement sur Amazon S3, où Athena pourra les interroger.

### Localisation de fichiers orphelins
<a name="insert-into-files-partial-data"></a>

Si une instruction `CTAS` ou `INSERT INTO` échoue, des données orphelines peuvent demeurer dans l’emplacement des données et pourraient être lues dans les requêtes suivantes. Pour localiser les fichiers orphelins en vue d'une inspection ou d'une suppression, vous pouvez utiliser le fichier manifeste de données fourni par Athena pour suivre la liste des fichiers à écrire. Pour plus d’informations, consultez [Identification des fichiers de sortie de requête](querying-finding-output-files.md#querying-identifying-output-files) et [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>

Spécifie la requête à exécuter sur une table, `source_table`, qui détermine les lignes à insérer dans une deuxième table, `destination_table`. Si la requête `SELECT` spécifie des colonnes de la `source_table`, les colonnes doivent correspondre exactement à celles de la `destination_table`.

Pour plus d'informations sur les requêtes `SELECT`, consultez [SELECT](select.md).

### Résumé
<a name="insert-into-select-synopsis"></a>

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

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

Sélectionner toutes les lignes de la table `vancouver_pageviews` et insérez-les dans la table `canada_pageviews` :

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

Sélectionner uniquement les lignes de la table `vancouver_pageviews` où la colonne `date` a une valeur comprise entre `2019-07-01` et `2019-07-31`, puis les insérer dans `canada_july_pageviews` :

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

Sélectionner les valeurs des colonnes `city` et `state` de la table `cities_world` uniquement à partir des lignes avec la valeur `usa` dans la colonne `country`, puis les insérer dans les colonnes `city` et `state` de la table `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>

Insère des lignes dans une table existante en spécifiant des colonnes et des valeurs. Les colonnes spécifiées et les types de données associés doivent correspondre précisément aux colonnes et aux types de données de la table de destination.

**Important**  
Nous vous déconseillons d'insérer des lignes à l'aide de `VALUES`, car Athena génère des fichiers pour chaque opération `INSERT`. Cela peut entraîner la création de nombreux petits fichiers et dégrader les performances de requête de la table. Pour identifier les fichiers créés par une requête `INSERT`, examinez le fichier manifeste de données. Pour de plus amples informations, veuillez consulter [Utilisation des résultats des requêtes et des requêtes récentes](querying.md).

### Résumé
<a name="insert-into-values-synopsis"></a>

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

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

Dans les exemples suivants, la table cities comporte quatre colonnes : `id`, `city`, `state` et `state_motto`. La colonne `id` est de type `INT` et toutes les autres colonnes sont de type `VARCHAR`.

Insérer une seule ligne dans la table `cities`, avec toutes les valeurs de colonne spécifiées :

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

Insérer deux lignes dans la table `cities` :

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