đ„ 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;
| DELETE | TRUNCATE | |
|---|---|---|
| Peut utiliser WHERE | â Oui | â Non |
| ROLLBACK possible | â Oui | â Non (DDL) |
| RĂ©initialise AUTO_INCREMENT | â Non | â Oui |
| Vitesse | Lent (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.