La commande SQL INSERT INTO transforme une page blanche en catalogue vivant de produits, clients ou transactions. Cette instruction constitue le point de départ de toute base de données utile en production.
Table des matières
Les différentes syntaxes
INSERT INTO propose plusieurs formes adaptées à chaque base de données et SGBDR. Chaque syntaxe SQL répond à un besoin précis, de l’insertion simple à l’ajout massif.
Voici les 2 syntaxes universelles pour les requêtes d’insertion :
-- Toutes les colonnes doivent être renseignées dans l'ordre (obligatoire)INSERT INTO table VALUES (value1, value2, value3, value4);
-- Colonnes spécifiques nommées (ordre libre)INSERT INTO table(field1, field2, field3) VALUES (value1, value2,value3);
-- Important : cette syntaxe est valide uniquement pour du code MySQL. Cette syntaxe n'existe PAS dans PostgreSQL, SQL Server ou SQLite.
INSERT INTO table SET
field1= value1,
field2= value2,
field3= value3;
Différence clé :
- Syntaxe 1 exige de remplir toutes les colonnes dans l’ordre exact de la définition de table
- Syntaxe 2 permet de choisir quelques colonnes seulement et l’ordre n’importe pas
Comparaison des syntaxes
| Syntaxe | Exemple | Avantage | SGBD |
|---|---|---|---|
VALUES | INSERT INTO produits VALUES (1, 'PC', 1200, 50) | Standard universel | Tous |
SET | INSERT INTO produits SET nom='PC', prix=1200 | Lecture comme UPDATE | MySQL seulement |
| Colonnes nommées | INSERT INTO produits (nom, prix) VALUES ('PC', 1200) | Flexible, portable | Tous |
Exemple complet
Table initiale produits (vide au départ) :
| id | nom | prix | stock |
|---|---|---|---|
Syntaxe 1 : La requête suivante spécifie toutes les colonnes dans l’ordre
INSERT INTO produits VALUES (1, 'Ordinateur', 1200.00, 50);
Après insertion :
| id | nom | prix | stock |
|---|---|---|---|
| 1 | Ordinateur | 1200.00 | 50 |
Syntaxe 2 : Dans cette requête , on va spécifier les colonnes
INSERT INTO produits (nom, prix, stock) VALUES ('Souris', 25.00, 200);
Après insertion :
| id | nom | prix | stock |
|---|---|---|---|
| 1 | Ordinateur | 1200.00 | 50 |
| 2 | Souris | 25.00 | 200 |
Syntaxe 3 : Insertion multiple (plusieurs lignes)
INSERT INTO produits (nom, prix, stock)
VALUES ('Clavier', 80.00, 150), ('Écran', 350.00, 75);
Après insertion complète :
| id | nom | prix | stock |
|---|---|---|---|
| 1 | Ordinateur | 1200.00 | 50 |
| 2 | Souris | 25.00 | 200 |
| 3 | Clavier | 80.00 | 150 |
| 4 | Écran | 350.00 | 75 |
Ces syntaxes du langage SQL couvrent 95% des besoins quotidiens. Les erreurs surviennent souvent par manque d’attention aux détails.
Erreurs courantes à éviter avec la commande SQL INSERT INTO
Même les développeurs expérimentés peuvent faire ces erreurs récurrentes. Une vérification méthodique prévient ces problèmes dès le départ. Chaque erreur génèrera un message précis qui guidera vers la correction. .
Incohérence des types de données
Le moteur SQL bloque l’insertion pour protéger l’intégrité des données. Une colonne prix de type DECIMAL refusera la chaîne de caractères ‘abc’.
Mauvaise requête :
INSERT INTO produits (nom, prix) VALUES ('Tableau', 'abc');
-- Erreur : Truncated incorrect DOUBLE value: 'abc'
Bonne requête :
INSERT INTO produits (nom, prix) VALUES ('Tableau', 150.50);
Mauvais nombre de valeurs
Le nombre de valeurs dans VALUES doit égaler exactement le nombre de colonnes listées. Une valeur manquante provoque une erreur de syntaxe.
Mauvaise requête :
INSERT INTO produits (nom, prix, stock) VALUES ('Chaise');
-- Erreur : Column count doesn't match value count
Bonne requête :
INSERT INTO produits (nom, prix, stock) VALUES ('Chaise', 75.00, 30);
Conflits de clés primaires ou UNIQUE
Un identifiant déjà existant dans la clé primaire bloque l’insertion complète. La table reste inchangée malgré la requête.
Mauvaise requête :
INSERT INTO produits (id, nom) VALUES (1, 'Duplicate');
-- Erreur : Duplicate entry '1' for key 'PRIMARY'
Bonne requête (avec id différent) :
INSERT INTO produits (id, nom) VALUES (5, 'Imprimante');
Guillemets manquants ou incorrects
Les chaînes de caractères exigent des guillemets simples uniques. Omettre les guillemets traite le nom comme une commande SQL inexistante.
Mauvaise requête :
INSERT INTO produits (nom) VALUES (Webcam);
-- Erreur : Unknown column 'Webcam' in 'field list'
Bonne requête :
INSERT INTO produits (nom) VALUES ('Webcam');
Omission de colonnes NOT NULL
Une colonne obligatoire sans valeur explicite empêche l’insertion. Le moteur respecte strictement les contraintes de définition.
Mauvaise requête :
INSERT INTO produits (nom) VALUES ('Casque');
-- Erreur : Field 'prix' doesn't have a default value
Bonne requête :
INSERT INTO produits (nom, prix) VALUES ('Casque', 45.00);
Permissions insuffisantes
La requête d’un utilisateur n’ayant pas les droits d’insertion échouera silencieusement ou avec un message disant que l’accès est refusé. Les privilèges définissent strictement les actions autorisées.
Mauvaise requête (sans droits) :
INSERT INTO produits (nom, prix) VALUES ('Test', 10.00);
-- Erreur : Access denied for user 'guest'@'localhost'
Solution : Demander le privilège « GRANT INSERT » au DBA.
Ces vérifications deviennent des réflexes après quelques semaines de pratique. Une technique puissante combine INSERT avec SELECT pour des transferts automatisés.
INSERT INTO avec SELECT explication
INSERT INTO SELECT copie automatiquement des lignes d’une table source vers une table cible. Cette combinaison évite la saisie manuelle et filtre précisément les données utiles. Les migrations et archives utilisent ce mécanisme.
Fonctionnement étape par étape :
- Exécution de la commande SQL SELECT : Le moteur traite WHERE, ORDER BY et jointure externe pour produire un résultat temporaire.
- Mapping des colonnes : Chaque colonne du résultat correspond à une colonne cible par position.
- Insertion ligne par ligne : Le moteur insère chaque enregistrement/résultat de la requête dans la table SQL cible.
- Commit final : Toutes les insertions réussissent ou la transaction entière échoue.
Exemple concret :
Table source ventes_2025 :
| id | produit | montant | date_vente |
|---|---|---|---|
| 1 | Ordinateur | 1200 | 2025-03-15 |
| 2 | Souris | 25 | 2025-04-02 |
| 3 | Écran | 350 | 2025-05-10 |
Requête :
INSERT INTO ventes_vip (produit, montant)
SELECT produit, montant FROM ventes_2025 WHERE montant > 100;
Résultat dans ventes_vip :
| produit | montant |
|---|---|
| Ordinateur | 1200 |
| Écran | 350 |
Cas d’usage courants :
- Regroupement et archivage des commandes passées vers table SQL historique
- Migration filtrée vers nouveau schéma
- Création de rapports consolidés depuis des tables brutes
- Duplication de données de test pour développement
Précautions essentielles :
- Vérifier compatibilité types (VARCHAR source vers INT cible = erreur)
- Tester avec LIMIT 10 sur données de développement
- Utiliser transactions :
START TRANSACTION; ... ROLLBACK;pour essais - Surveiller contraintes FOREIGN KEY bloquantes
Cette approche optimise les flux de données complexes. MySQL propose une variante spécifique qui change la réaction aux doublons.
Différence entre INSERT INTO et INSERT IGNORE
INSERT IGNORE, exclusif à MySQL et MariaDB, modifie le comportement face aux erreurs. Les doublons ou contraintes violées génèrent des avertissements au lieu d’erreurs fatales. Le traitement continue sur les lignes suivantes.
INSERT INTO arrête tout dès la première erreur. Aucune ligne ne s’insère si une violation survient dans un lot multiple. Ce comportement protège l’intégrité mais casse les imports massifs.
INSERT IGNORE poursuit l’insertion en ignorant les lignes problématiques :
INSERT IGNORE INTO produits (id, nom, prix) VALUES
(1, 'Duplicate', 100), (5, 'Valide', 200), (1, 'Autre doublon', 50);
Résultat : seule la ligne id=5 s’insère, 2 warnings générés.
Tableau comparatif
| Critère | INSERT INTO | INSERT IGNORE |
|---|---|---|
| Doublon clé primaire | ❌ Erreur fatale | ⚠️ Avertissement |
| Lot multiple | Arrêt total | Continue |
| Autres erreurs | Bloque tout | Ignore tout |
| Retour nombre lignes | Précis | 0 pour lignes ignorées |
| Usage recommandé | Production | Imports CSV non fiables |
Préférez INSERT INTO pour un contrôle strict, INSERT IGNORE pour les imports tolérants. Il est important de toujours tester sur un jeu de données de test en développement avant d’exécuter la requête en environnement de production.
Sources : Postgresql