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.
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.
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.
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.
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.
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.
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.
MySQL Reference Manual that can
be found at dev.mysql.com. The original
Reference Manual is in English, and
this translation is not necessarily
as up to date as the English version.
|