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
. See Section 13.1.9, « 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
Section 15.7.3, « 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
. See
Section 3.6.9, « 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
Section 7.2.16, « Rapidité 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
Section 13.5.2.5, « Syntaxe de OPTIMIZE TABLE
» et
Section 5.7.3.10, « 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 Section 13.1.7.1, « 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.
This is a translation of the 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.