TRUNCATE vs DELETE : comprendre la différence
Quand tu veux “vider” une table en SQL, tu as deux options principales : DELETE et TRUNCATE. Les deux peuvent sembler similaires, mais ils n’ont pas du tout le même comportement (performance, journalisation, contraintes, auto-incrément, triggers…).
ℹ️ Résumé rapide
DELETE supprime des lignes (avec filtre possible) et respecte les contraintes ligne par ligne.
TRUNCATE “réinitialise” la table (très rapide) mais est plus strict avec les clés étrangères.
DELETE : supprimer des lignes
DELETE supprime des lignes une par une (logiquement), peut être filtré et déclenche les contraintes et triggers associés.
Supprimer une ligne précise
DELETE FROM clients
WHERE id = 42;Supprimer plusieurs lignes (avec condition)
DELETE FROM clients
WHERE actif = 0;Supprimer toutes les lignes (sans condition)
DELETE FROM clients;⚠️ Attention
UnDELETEsansWHEREsupprime toutes les lignes. Vérifie toujours ta requête avant exécution.
Ce que DELETE implique
- ✅ Peut supprimer partiellement une table (avec
WHERE) - ✅ Respecte les contraintes, peut déclencher des actions
ON DELETE(CASCADE/RESTRICT/SET NULL…) - ✅ Déclenche les triggers
BEFORE DELETE/AFTER DELETE(si présents) - ⚠️ Peut être plus lent sur de très grosses tables
- ⚠️ L’auto-incrément n’est pas forcément réinitialisé (dépend du SGBD / paramétrage)
TRUNCATE : vider une table très rapidement
TRUNCATE vide une table en une opération. Dans beaucoup de SGBD (MySQL/MariaDB), c’est proche d’un “reset” de la table (suppression physique / réinitialisation).
Vider la table
TRUNCATE TABLE clients;Ce que TRUNCATE implique
- ✅ Très rapide (surtout sur gros volumes)
- ✅ Réinitialise généralement l’auto-incrément (
AUTO_INCREMENT) - ⚠️ Ne permet pas de filtrer : pas de
WHERE - ⚠️ Peut être bloqué par des clés étrangères
- ⚠️ Selon le SGBD, les triggers DELETE ne se déclenchent pas (souvent le cas)
💡 Astuce
UtiliseTRUNCATEpour des tables temporaires, caches, logs, tables de test… quand tu veux repartir “à zéro” vite.
TRUNCATE et clés étrangères : pourquoi ça bloque ?
Si une table est référencée par une clé étrangère (une autre table pointe vers elle), un TRUNCATE peut échouer. Exemple :
Exemple de schéma
-- Table parent
CREATE TABLE clients (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
nom VARCHAR(120) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
-- Table enfant (référence clients)
CREATE TABLE commandes (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
client_id INT UNSIGNED NOT NULL,
total DECIMAL(10,2) NOT NULL DEFAULT 0,
PRIMARY KEY (id),
CONSTRAINT fk_commandes_clients
FOREIGN KEY (client_id) REFERENCES clients(id)
) ENGINE=InnoDB;Si tu fais :
TRUNCATE TABLE clients;Tu risques un blocage car commandes.client_id dépend de clients.id.
⚠️ Attention
Même sicommandesest vide, le simple fait d’avoir une contrainte peut empêcherTRUNCATEselon la configuration.
Solution : désactiver temporairement les clés étrangères (MySQL/MariaDB)
…
🔒
Accès complet réservé aux membres
Connecte-toi pour lire l’article en entier.