SQL INSERT INTO: Comment insérer des données dans une table en SQL ?

Par :

,le

La commande SQL INSERT INTO ajoute une ou plusieurs lignes de données dans une table existante d’une base de données relationnelle.

Syntaxe de base

INSERT INTO propose deux syntaxes universelles compatibles avec tous les SGBD courants. Le choix entre les deux dépend du nombre de colonnes à renseigner et de la flexibilité souhaitée.

-- Syntaxe 1 : toutes les colonnes renseignées dans l'ordre de la table
INSERT INTO produits VALUES (1, 'Ordinateur', 1200.00, 50);

-- Syntaxe 2 : colonnes nommées explicitement, ordre libre
INSERT INTO produits (nom, prix, stock) VALUES ('Souris', 25.00, 200);

La première syntaxe exige de renseigner toutes les colonnes dans l’ordre exact de définition de la table. La seconde syntaxe permet de sélectionner uniquement certaines colonnes, dans n’importe quel ordre. Cette deuxième forme est recommandée en production car elle résiste aux modifications de structure de table.

MySQL propose une troisième syntaxe avec SET, absente de PostgreSQL, SQL Server et SQLite.

-- Syntaxe MySQL uniquement
INSERT INTO produits SET nom = 'Clavier', prix = 80.00, stock = 150;

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

Comment insérer une seule ligne en SQL ?

La table produits est initialement vide avec les colonnes idnomprix et stock. La requête suivante insère un premier enregistrement en listant toutes les colonnes explicitement.

INSERT INTO produits (nom, prix, stock) VALUES ('Ordinateur', 1200.00, 50);
idnomprixstock
1Ordinateur1200.0050

La colonne id est renseignée automatiquement par l’auto-incrémentation définie à la création de la table. Vérifiez que le nombre de valeurs correspond exactement au nombre de colonnes listées.

Comment insérer plusieurs lignes en même temps ?

INSERT INTO accepte plusieurs tuples de valeurs séparés par des virgules dans un seul appel. Cette forme réduit le nombre d’allers-retours entre l’application et la base de données.

Pour ajouter deux produits simultanément, on liste chaque tuple de valeurs entre parenthèses après VALUES.

INSERT INTO produits (nom, prix, stock)
VALUES ('Clavier', 80.00, 150),
       ('Écran', 350.00, 75);
idnomprixstock
1Ordinateur1200.0050
2Souris25.00200
3Clavier80.00150
4Écran350.0075

Les quatre lignes apparaissent dans la table après exécution de l’ensemble des insertions. Si une ligne du lot viole une contrainte, toute l’insertion échoue et aucune ligne n’est ajoutée.

Comment copier des données en SQL ?

INSERT INTO combiné à SELECT copie automatiquement des lignes d’une table source vers une table cible. Cette combinaison évite la saisie manuelle et permet de filtrer précisément les données à transférer. Les migrations de données et les archivages utilisent régulièrement ce mécanisme.

La table ventes_2025 contient l’historique des ventes de l’année. La requête suivante copie uniquement les ventes supérieures à 100 € vers la table ventes_vip.

INSERT INTO ventes_vip (produit, montant)
SELECT produit, montant
FROM ventes_2025
WHERE montant > 100;
produitmontant
Ordinateur1200
Écran350

Seules les lignes correspondant à la condition WHERE sont copiées dans la table cible. Vérifiez la compatibilité des types entre les colonnes source et cible avant d’exécuter la requête.

Différence entre INSERT INTO et INSERT IGNORE

INSERT IGNORE est une variante propre à MySQL et MariaDB qui modifie le comportement face aux erreurs de contraintes. Les doublons de clé primaire ou les violations de contraintes génèrent des avertissements au lieu d’erreurs fatales. Le traitement continue sur les lignes suivantes du lot.

La commande SQL INSERT INTO standard stoppe toute l’opération dès la première erreur rencontrée. Aucune ligne du lot n’est insérée si une seule violation survient, ce qui garantit l’intégrité des données.

-- INSERT IGNORE : seule la ligne id=5 s'insère, les doublons sont ignorés
INSERT IGNORE INTO produits (id, nom, prix)
VALUES (1, 'Doublon', 100.00),
       (5, 'Imprimante', 200.00),
       (1, 'Autre doublon', 50.00);
CritèreINSERT INTOINSERT IGNORE
Doublon clé primaire❌ Erreur fatale⚠️ Avertissement
Lot multipleArrêt totalContinue
Autres erreursBloque toutIgnore tout
Usage recommandéProductionImports CSV non fiables

Bonnes pratiques

Règle 1 — Toujours nommer les colonnes explicitement
INSERT INTO produits (nom, prix) VALUES ('Écran', 350.00) résiste aux ajouts futurs de colonnes, contrairement à la syntaxe sans liste de colonnes.

Règle 2 — Tester avec LIMIT sur un jeu de données réduit
Avant un import massif avec INSERT INTO SELECT, testez la requête avec LIMIT 10 pour valider les types et les contraintes.

Règle 3 — Encadrer les imports critiques dans une transaction
START TRANSACTION suivi d’un ROLLBACK permet d’annuler l’ensemble des insertions si une erreur survient en cours de traitement.

Règle 4 — Vérifier les contraintes FOREIGN KEY avant l’insertion
Une valeur référencée absente dans la table parente bloque l’insertion et génère une erreur de contrainte d’intégrité référentielle.

Règle 5 — Utiliser INSERT IGNORE uniquement pour les imports tolérants
En production avec des données critiques, INSERT INTO standard offre un contrôle strict et prévisible sur l’intégrité des données insérées.

Cas pratique métier

Un service logistique réapprovisionne le stock en ajoutant trois nouveaux produits issus d’un catalogue fournisseur, tout en ignorant les références déjà présentes en base.

INSERT INTO produits (nom, prix, stock)
VALUES ('Webcam', 89.00, 60),
       ('Casque audio', 45.00, 120),
       ('Hub USB', 29.00, 200);

Erreurs courantes

❌ Erreur : type de données incompatible
INSERT INTO produits (nom, prix) VALUES ('Tableau', 'abc');
-- Le moteur refuse une chaîne dans une colonne DECIMAL.

✅ Correct :
INSERT INTO produits (nom, prix) VALUES ('Tableau', 150.50);
❌ Erreur : nombre de valeurs incorrect
INSERT INTO produits (nom, prix, stock) VALUES ('Chaise');
-- Le nombre de valeurs ne correspond pas au nombre de colonnes listées.

✅ Correct :
INSERT INTO produits (nom, prix, stock) VALUES ('Chaise', 75.00, 30);
❌ Erreur : doublon sur clé primaire
INSERT INTO produits (id, nom) VALUES (1, 'Doublon');
-- L'identifiant 1 existe déjà dans la table.

✅ Correct :
INSERT INTO produits (id, nom) VALUES (5, 'Imprimante');
❌ Erreur : guillemets manquants sur une chaîne
INSERT INTO produits (nom) VALUES (Webcam);
-- Le moteur interprète Webcam comme un nom de colonne inexistant.

✅ Correct :
INSERT INTO produits (nom) VALUES ('Webcam');

Sources : Postgresql