La commande SQL INSERT INTO ajoute une ou plusieurs lignes de données dans une table existante d’une base de données relationnelle.
Table des matières
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
| 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 |
Comment insérer une seule ligne en SQL ?
La table produits est initialement vide avec les colonnes id, nom, prix 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);
| id | nom | prix | stock |
|---|---|---|---|
| 1 | Ordinateur | 1200.00 | 50 |
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);
| id | nom | prix | stock |
|---|---|---|---|
| 1 | Ordinateur | 1200.00 | 50 |
| 2 | Souris | 25.00 | 200 |
| 3 | Clavier | 80.00 | 150 |
| 4 | Écran | 350.00 | 75 |
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;
| produit | montant |
|---|---|
| Ordinateur | 1200 |
| Écran | 350 |
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ère | INSERT INTO | INSERT IGNORE |
|---|---|---|
| Doublon clé primaire | ❌ Erreur fatale | ⚠️ Avertissement |
| Lot multiple | Arrêt total | Continue |
| Autres erreurs | Bloque tout | Ignore tout |
| Usage recommandé | Production | Imports CSV non fiables |
Bonnes pratiques
Règle 1 — Toujours nommer les colonnes explicitementINSERT 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 transactionSTART 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