Syntaxe des commandes SQL
<<<
Syntaxe de DELETE Syntaxe de DO
>>>

14.1 Manipulation de données : SELECT , INSERT , UPDATE , DELETE
14 Syntaxe des commandes SQL
 Manuel de Référence MySQL 4.1 : Version Française

->Syntaxe de DELETE
Syntaxe de DO
Syntaxe de HANDLER
Syntaxe de INSERT
Syntaxe de LOAD DATA INFILE
Syntaxe de REPLACE
Syntaxe de SELECT
Sous-sélections ( SubSELECT )
Syntaxe de TRUNCATE
Syntaxe de UPDATE

14.1.1 Syntaxe de DELETE


DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name
       [WHERE where_definition]
       [ORDER BY ...]
       [LIMIT row_count]
Syntaxe multi-tables :

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...]
       FROM table-references
       [WHERE where_definition]
ou :

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
       FROM table_name[.*] [, table_name[.*] ...]
       USING table-references
       [WHERE where_definition]
DELETE efface les enregistrements de nom_de_table qui satisfont la condition donnée par clause_where , et retourne le nombre d'enregistrements effacés.Si vous exécutez un DELETE sans clause WHERE , tous les enregistrements sont effacés. Si vous le faites en mode AUTOCOMMIT cela aura le même effet qu'un TRUNCATE . Syntaxe de TRUNCATE .

Avec MySQL 3.23, DELETE sans clause WHERE retournera zéro comme nombre d'enregistrements affectés.

Si vous voulez vraiment savoir combien d'enregistrements ont été effacés quand vous videz une table, et que vous êtes prêts à souffrir d'un léger ralentissement, vous pouvez utiliser une requête DELETE de ce genre :

mysql> DELETE FROM nom_de_table WHERE 1>0;
Notez que c'est plus lent que DELETE FROM nom_de_table sans clause WHERE , parce que cela efface un enregistrement à la fois.Si vous effacez des lignes contenant la valeur maximum d'une colonne AUTO_INCREMENT , la valeur sera réutilisée pour par une table ISAM ou BDB , mais pas pour une table MyISAM ou InnoDB . Si vous effacez toutes les lignes dans une table avec une commande DELETE FROM tbl_name (avec une clause WHERE ) avec le mode AUTOCOMMIT , la séquence redémarrer à zéro pour tous les types de table sauf InnoDB et, depuis MySQL 4.0, MyISAM . Il y a des exceptions à ce comportement pour les tables InnoDB , qui sont présentées dans la section Comment les colonnes AUTO_INCREMENT fonctionnent avec InnoDB .

Pour les tables MyISAM et BDB , vous pouvez spécifier une autre colonne AUTO_INCREMENT dans une clé multi-colonnes. Dans ce cas, la réutilisation des clés à partir de la fin de la séquence se fait aussi pour les tables MyISAM . Utiliser AUTO_INCREMENT .

La commande DELETE supporte les clauses suivantes :
  • Si vous spécifiez le mot clé LOW_PRIORITY , l'exécution de la commande DELETE est repoussée jusqu'à ce qu'aucun client ne soit en train de lire la table.
  • Pour les tables MyISAM , si vous spécifiez l'option QUICK , le moteur de stockage ne compacte pas les index durant l'effacement, ce qui peut accélérer certains effacements.
  • L'option IGNORE fait que MySQL ignore les erreurs durant le traitement des lignes. Les erreurs rencontrées durant la phase d'analyse sont traitées comme d'habitude. Les erreurs qui sont ignorées grâce à cette options sont listées comme des alertes. Cette option a été ajoutée en MySQL 4.1.1.

La vitesse d'exécution des opérations de suppressions peut être affectées par les facteurs présentés dans la section Vitesse des requêtes DELETE .

Dans les tables de type MyISAM , les enregistrements effacés sont maintenus dans une liste liée et les requêtes INSERT suivantes réutilisent les vieux emplacements. Pour recouvrir l'espace inutilisé ou réduire la taille des fichiers, utilisez la commande OPTIMIZE TABLE ou l'utilitaire myisamchk pour réorganiser les tables. OPTIMIZE TABLE est plus simple, mais myisamchk est plus rapide. Voyez Syntaxe de OPTIMIZE TABLE et Optimisation de table .

La clause spécifique MySQL LIMIT row_count de la commande DELETE indique au serveur le nombre maximal de ligne à supprimer avant de rendre le contrôle au client. Elle peut être utilisée pour s'assurer qu'une commande DELETE ne prend pas trop de temps. Vous pouvez simplement répéter la commande DELETE jusqu'à ce que le nombre de lignes effacées est inférieure à la valeur de LIMIT .

Si la commande DELETE inclut la clause ORDER BY , les lignes sont effacées dans l'ordre spécifiée par cette clause. Elle n'est vraiment utilise que lorsqu'elle est couplée avec la clause LIMIT . Par exemple, la commande suivante applique la condition WHERE , trie les lignes avec la colonne timestamp , et efface la ligne la plus ancienne :

DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1
ORDER BY peut être utilisée avec DELETE depuis MySQL version 4.0.0.Depuis MySQL version 4.0, vous pouvez spécifier plusieurs tables dans la commande DELETE , pour effacer des lignes dans plusieurs tables, en fonction d'une condition de liaison. Cependant, vous ne pouvez pas utiliser les clauses ORDER BY et LIMIT dans une suppression DELETE multi-tables.

La première syntaxe de DELETE multi-table est supportée depuis MySQL 4.0.0. La deuxième syntaxe de DELETE multi-table est supportée depuis MySQL 4.0.2. La partie table_references liste les tables impliquées dans la jointure. Sa syntaxe est décrite dans la section Syntaxe de JOIN .

L'idée est que seul les lignes concordante dans les tables énumérées avant le FROM ou avant la clause USING sont effacés. Le but est de pouvoir effacer des lignes de plusieurs tables en même temps tout en ayant d'autres tables pour les recherches.

Le code .* après les noms de tables n'est présent que pour assurer la compatibilité avec Access :


DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
ou :

DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
Dans les cas précédents, nous n'avons supprimé les lignes correspondantes que dans les tables t1 et t2 .Les exemples ci-dessus présente des jointures internes, en utilisant l'opérateur virgule, mais les DELETE multi-tables peuvent utiliser n'importe quel type de jointure qu'une commande SELECT accepte, comme un LEFT JOIN .

La syntaxe autorise .* après le nom de la table pour assurer la compatibilité avec Access .

Si vous utilisez une commande DELETE multi-tables avec des tables InnoDB pour lesquelles il y a des contraintes de clés étrangères, l'optimiseur MySQL risque de traiter les tables dans un ordre qui diffère de celui des relations parent/enfant de la clé. Dans ce cas, la commande échouera, et s'annulera. Pour résoudre ce problème, effacez les lignes tables par table, et utilisez les fonctionnalités ON DELETE que InnoDB fournit pour que les autres tables soient correctement traitées.

Note : en MySQL 4.0, vous devez utiliser le véritable nom de table. En MySQL 4.1, vous devez utiliser l'alias éventuel, lorsque vous nommez la table :

En MySQL 4.0 :

DELETE test FROM test AS t1, test2 WHERE ...
En MySQL 4.1 :

DELETE t1 FROM test AS t1, test2 WHERE ...
La raison qui nous a poussé à ne pas faire ce changement en version 4.0, est la compatibilité ascendante avec les vieilles applications 4.0, qui utilisent la vieille syntaxe.

<< Syntaxe de DELETE >>
Syntaxe des commandes SQL Manipulation de données : SELECT , INSERT , UPDATE , DELETE Syntaxe de DO