đŸ“„ INSERT — InsĂ©rer des donnĂ©es

INSERT simple

-- Syntaxe recommandée : toujours spécifier les colonnes
INSERT INTO clients (nom, email, ville)
VALUES ('Alice Martin', 'alice@email.fr', 'Paris');

-- Récupérer l'id de la ligne insérée
SELECT LAST_INSERT_ID();

INSERT multi-lignes

-- Plus efficace : une seule transaction SQL
INSERT INTO produits (nom, prix, stock, categorie_id) VALUES
  ('Smartphone Pro', 899.00, 50, 1),
  ('Laptop Ultra',  1299.00, 20, 1),
  ('T-shirt',         29.99, 200, 2);

INSERT ... SELECT

-- Copier des données d'une table vers une autre
CREATE TABLE produits_archive LIKE produits;

INSERT INTO produits_archive
SELECT * FROM produits WHERE stock = 0;
SpĂ©cifiez toujours les noms de colonnes dans votre INSERT. Si la structure de la table change, votre requĂȘte restera correcte.

✏ UPDATE — Modifier des donnĂ©es

-- UPDATE ciblé (toujours utiliser WHERE !)
UPDATE produits SET prix = 849.00 WHERE id = 1;

-- Plusieurs colonnes
UPDATE produits
SET prix  = ROUND(prix * 1.10, 2),
    stock = stock + 10
WHERE categorie_id = 1;

-- UPDATE avec JOIN (modifier en fonction d'une autre table)
UPDATE produits p
JOIN categories c ON p.categorie_id = c.id
SET p.prix = ROUND(p.prix * 0.90, 2)   -- solde -10%
WHERE c.nom = 'Alimentation';

-- Limiter les lignes modifiées
UPDATE produits SET stock = 0 WHERE stock < 0 LIMIT 100;
Sans WHERE, UPDATE modifie TOUTES les lignes ! Vérifiez toujours votre condition avec un SELECT identique avant d'exécuter un UPDATE en production.

đŸ—‘ïž DELETE — Supprimer des donnĂ©es

-- DELETE ciblé
DELETE FROM clients WHERE id = 5;

-- DELETE conditionnel
DELETE FROM produits WHERE stock = 0 AND created_at < '2023-01-01';

-- Limiter les suppressions (utile pour les lots)
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 90 DAY LIMIT 1000;

-- TRUNCATE : vide toute la table, plus rapide que DELETE sans WHERE
TRUNCATE TABLE produits_archive;
DELETETRUNCATE
Peut utiliser WHERE✅ Oui❌ Non
ROLLBACK possible✅ Oui❌ Non (DDL)
RĂ©initialise AUTO_INCREMENT❌ Non✅ Oui
VitesseLent (log ligne par ligne)Rapide
Triggers✅ DĂ©clenche❌ Ne dĂ©clenche pas

🔄 UPSERT — INSERT ou UPDATE

ON DUPLICATE KEY UPDATE

-- Si la clĂ© existe → UPDATE, sinon → INSERT
INSERT INTO categories (nom, description)
VALUES ('Electronique', 'High-tech et accessoires')
ON DUPLICATE KEY UPDATE
  description = VALUES(description);

-- Compteur d'accÚs : incrémente à chaque visite
INSERT INTO stats_pages (url, nb_vues)
VALUES ('/accueil', 1)
ON DUPLICATE KEY UPDATE nb_vues = nb_vues + 1;

REPLACE INTO

-- REPLACE = DELETE puis INSERT (si clé dupliquée)
-- Attention : les colonnes non spécifiées prennent leur valeur DEFAULT
REPLACE INTO categories (id, nom, description)
VALUES (1, 'Electronique', 'Nouvelle description');
Préférez ON DUPLICATE KEY UPDATE à REPLACE INTO : REPLACE supprime la ligne entiÚre avant de la réinsérer, ce qui peut déclencher des triggers DELETE et réinitialiser les colonnes non spécifiées.

💡 Patterns avancĂ©s

Transaction pour opération multi-tables

START TRANSACTION;

INSERT INTO commandes (client_id, statut)
VALUES (1, 'confirmee');

SET @cmd_id = LAST_INSERT_ID();

INSERT INTO commande_produits (commande_id, produit_id, quantite, prix_unitaire)
VALUES (@cmd_id, 3, 2, 29.99);

UPDATE produits SET stock = stock - 2 WHERE id = 3;

COMMIT;  -- ou ROLLBACK en cas d'erreur

Conditions CASE dans UPDATE

-- Appliquer des remises différentes selon la catégorie
UPDATE produits p
JOIN categories c ON p.categorie_id = c.id
SET p.prix = p.prix * CASE
  WHEN c.nom = 'Alimentation' THEN 0.90   -- -10%
  WHEN c.nom = 'Electronique' THEN 0.95   -- -5%
  ELSE 1.00
END;

đŸ—‚ïž Soft Delete (suppression logique)

Au lieu de supprimer physiquement une ligne, on la marque comme supprimée via une colonne deleted_at.

-- Ajouter la colonne
ALTER TABLE clients ADD COLUMN deleted_at DATETIME NULL DEFAULT NULL;

-- "Supprimer" un client
UPDATE clients SET deleted_at = NOW() WHERE id = 5;

-- RequĂȘte standard : toujours filtrer les supprimĂ©s
SELECT * FROM clients WHERE deleted_at IS NULL;

-- Restaurer
UPDATE clients SET deleted_at = NULL WHERE id = 5;

-- Vraie suppression des anciennes entrées aprÚs 1 an
DELETE FROM clients
WHERE deleted_at IS NOT NULL
  AND deleted_at < NOW() - INTERVAL 1 YEAR;
Le soft delete est essentiel quand les données ont une valeur historique ou légale (RGPD : droit à l'effacement différé), quand des FK pointent vers cet enregistrement, ou quand on veut permettre la restauration.