SQL INSERT INTO: Insérer des données avec cette requête SQL

Par :

,le

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.

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

SyntaxeExempleAvantageSGBD
VALUESINSERT INTO produits VALUES (1, 'PC', 1200, 50)Standard universelTous
SETINSERT INTO produits SET nom='PC', prix=1200Lecture comme UPDATEMySQL seulement
Colonnes nomméesINSERT INTO produits (nom, prix) VALUES ('PC', 1200)Flexible, portableTous

Exemple complet

Table initiale produits (vide au départ) :

idnomprixstock

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 :

idnomprixstock
1Ordinateur1200.0050

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 :

idnomprixstock
1Ordinateur1200.0050
2Souris25.00200

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 :

idnomprixstock
1Ordinateur1200.0050
2Souris25.00200
3Clavier80.00150
4Écran350.0075

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 :

  1. Exécution de la commande SQL SELECT : Le moteur traite WHERE, ORDER BY et jointure externe pour produire un résultat temporaire.
  2. Mapping des colonnes : Chaque colonne du résultat correspond à une colonne cible par position.
  3. Insertion ligne par ligne : Le moteur insère chaque enregistrement/résultat de la requête dans la table SQL cible.
  4. Commit final : Toutes les insertions réussissent ou la transaction entière échoue.

Exemple concret :

Table source ventes_2025 :

idproduitmontantdate_vente
1Ordinateur12002025-03-15
2Souris252025-04-02
3Écran3502025-05-10

Requête :

INSERT INTO ventes_vip (produit, montant)
SELECT produit, montant FROM ventes_2025 WHERE montant > 100;

Résultat dans ventes_vip :

produitmontant
Ordinateur1200
Écran350

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èreINSERT INTOINSERT IGNORE
Doublon clé primaire❌ Erreur fatale⚠️ Avertissement
Lot multipleArrêt totalContinue
Autres erreursBloque toutIgnore tout
Retour nombre lignesPrécis0 pour lignes ignorées
Usage recommandéProductionImports 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