La commande INSERT est la première instruction que vous utilisez pour peupler une base de données. Bien que sa syntaxe de base soit simple, elle recèle des variantes puissantes — et des pièges courants — que les candidats sous-estiment en entretien. Que vous ayez à insérer une seule ligne, des milliers d'enregistrements en batch, ou les résultats d'une requête SELECT, maîtriser INSERT INTO correctement fait la différence entre un code fragile et un code production-ready.
Ce guide couvre toutes les formes de la commande INSERT, les erreurs classiques à éviter, et les optimisations à connaître pour un entretien technique SQL.
📌 Ce qu'il faut retenir
INSERT INTO ... VALUESest la forme de base ; toujours lister les colonnes explicitement- L'insertion multi-lignes en une seule requête est nettement plus performante que les insertions unitaires
INSERT INTO ... SELECTpermet de copier ou transformer des données directement en base- Les contraintes (NOT NULL, UNIQUE, FK) sont vérifiées à l'insertion : anticiper les erreurs de contrainte
La syntaxe de base de INSERT INTO
La forme minimale de INSERT s'écrit en deux parties : la déclaration de la cible, et les valeurs à insérer.
INSERT INTO employes (prenom, nom, departement_id, salaire)
VALUES ('Alice', 'Martin', 3, 45000);
Ici, la liste des colonnes entre parenthèses est facultative syntaxiquement, mais obligatoire en pratique. Omettre les colonnes force l'ordre de la définition de la table, ce qui rend le code cassant dès qu'un ALTER TABLE ajoute ou réordonne une colonne.
La valeur associée à chaque colonne doit respecter le type déclaré : une chaîne pour un VARCHAR, un entier pour un INT, et NULL pour les colonnes qui l'autorisent. Toute violation déclenchera une erreur avant même que la ligne soit écrite.
⚠️ Attention
Ne jamais omettre la liste des colonnes dans un INSERT en production. Un ajout de colonne en base suffit à faire planter silencieusement ou bruyamment tous vos scripts d'alimentation.
Insérer plusieurs lignes en une seule requête
Depuis SQL:2003, la plupart des SGBD acceptent l'insertion multi-lignes dans un unique INSERT. C'est la façon la plus efficace de charger des données en lot.
INSERT INTO employes (prenom, nom, departement_id, salaire)
VALUES
('Bob', 'Dupont', 1, 38000),
('Claire', 'Leroy', 2, 52000),
('David', 'Morin', 1, 41000);
Cette syntaxe réduit drastiquement le nombre d'allers-retours réseau entre l'application et la base. Sur un chargement de 10 000 lignes, passer de 10 000 requêtes unitaires à quelques centaines de requêtes multi-lignes peut diviser le temps d'exécution par un facteur 10 à 50.
La limite pratique du nombre de lignes par INSERT dépend du SGBD et de la taille des données : PostgreSQL et MySQL gèrent sans problème des milliers de lignes par requête, mais il est prudent de découper au-delà de 5 000 lignes pour éviter les timeouts et faciliter la gestion des erreurs.
INSERT INTO ... SELECT : copier et transformer à la volée
La forme INSERT INTO ... SELECT est l'une des plus utiles en data engineering. Elle insère directement les résultats d'une requête SELECT dans une table cible, sans passer par l'application cliente.
INSERT INTO employes_archive (prenom, nom, departement_id, salaire, archive_date)
SELECT prenom, nom, departement_id, salaire, CURRENT_DATE
FROM employes
WHERE date_depart IS NOT NULL;
Cette technique est centrale pour les pipelines ETL légers : alimenter une table de staging, archiver des lignes expirées, ou dédupliquer un jeu de données. Elle évite un aller-retour applicatif coûteux et permet d'exploiter toute la puissance de SQL (JOINs, fonctions d'agrégat, CTEs) dans la requête source.
Pour aller plus loin sur la structuration de requêtes complexes, consultez l'article sur les CTE SQL : Common Table Expressions — elles s'intègrent parfaitement avec INSERT INTO ... SELECT.
💡 Bon à savoir
Avec PostgreSQL, vous pouvez utiliser INSERT INTO ... SELECT combiné à un WITH (CTE) pour pré-calculer des transformations complexes avant insertion, le tout en une seule instruction atomique.
Comparaison des variantes INSERT selon les SGBD
Les syntaxes diffèrent légèrement selon le moteur utilisé. Voici un tableau de référence rapide pour les 4 principaux SGBD rencontrés en entretien.
| Fonctionnalité | PostgreSQL | MySQL / MariaDB | SQLite | SQL Server |
|---|---|---|---|---|
| INSERT multi-lignes | ✅ | ✅ | ✅ | ✅ |
| INSERT ... SELECT | ✅ | ✅ | ✅ | ✅ |
| INSERT ... RETURNING | ✅ | ❌ (utiliser LAST_INSERT_ID) | ✅ (v3.35+) | OUTPUT au lieu de RETURNING |
| INSERT OR IGNORE / ON CONFLICT | ON CONFLICT DO NOTHING | INSERT IGNORE | INSERT OR IGNORE | pas d'équivalent natif simple |
| UPSERT natif | ON CONFLICT DO UPDATE | ON DUPLICATE KEY UPDATE | INSERT OR REPLACE | MERGE |
