7.10 DELETE

DELETE [LOW_PRIORITY] FROM Nom_table
    [WHERE where_definition] [LIMIT rows]

DELETE efface les lignes de la table Nom_table qui satisfont les conditions données par where_definition, et retourne le nombre de ligne effacées.

Une commande DELETE sans clause WHERE s'applique à toutes les lignes, c'est à dire que la table est vidée de toutes ses données (mais elle n'est pas effacée). MySQL recrée alors la table, mais vide, ce qui est nettement plus rapide que d'effacer les lignes unes à unes. Dans ce cas particulier, MySQL retourne 0 (. (MySQL ne peut pas connaître le nombre de ligne de la table sans l'avoir ouverte, car la recréation est faite sans accéder à la table), return the number of rows that were actually deleted, since the recreate is done without opening the data files). Tant que le fichier ``Nom_table.frm' est valide, il est possible de recréer la table, même si le fichier de données est corrompu).'

Pour obtenir le nombre de ligne effacées lors de l'effacement de la table, il est toujours possible de sacrifier la vitesse d'exécution, et d'utiliser la commande suivante :

mysql> DELETE FROM Nom_table WHERE 1>0;

Cette requête est particulièrement LENTE, car l'effacement se fait ligne à ligne, à cause de la clause WHERE

L'option LOW_PRIORITY permet de reporter l'effacement jusqu'au moment ou il ne reste plus personne qui lise la table.

Les ligne effacées sont conservées dans une liste, et les insertions ultérieurs réutiliseront cette place. Pour forcer la récupération de cette place, il faut utiliser la commande OPTIMIZE TABLE ou bien l'utilitaire isamchk pour réorganiser les tables. OPTIMIZE TABLE est plus simple, mais isamchk plus rapide. OPTIMIZE TABLE.

L'option LIMIT, spécifique à MySQL, permet d'indiquer au serveur le nombre maximum de ligne à effacer. Cela permet d'éviter qu'une commande DELETE ne prenne trop de temps. Il suffit alors de répéter la commande jusqu'à ce qu'elle ait effacé moins de ligne que LIMIT.