6.4 Manipulation de données : SELECT , INSERT , UPDATE , DELETE
6 Référence du langage MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Syntaxe de SELECT . Syntaxe de HANDLER . Syntaxe de INSERT . Syntaxe de INSERT DELAYED . Syntaxe de UPDATE ->Syntaxe de DELETE . Syntaxe de TRUNCATE . Syntaxe de REPLACE . Syntaxe de LOAD DATA INFILE . Syntaxe de DO
|
6.4.6 Syntaxe de DELETE
DELETE [LOW_PRIORITY] [QUICK] FROM nom_de_table [WHERE clause_where] [ORDER BY ...] [LIMIT lignes] ou DELETE [LOW_PRIORITY] [QUICK] nom_de_table[.*] [,nom_de_table[.*] ...] FROM table-references [WHERE clause_where] ou DELETE [LOW_PRIORITY] [QUICK] FROM nom_de_table[.*], [nom_de_table[.*] ...] USING table-references [WHERE clause_where]
|
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 des
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 spécifiez le mot clef
LOW_PRIORITY
, l'exécution du
DELETE
sera repoussée jusqu'à ce qu'aucun client ne lise plus de la table.
Si vous spécifiez le mot
QUICK
, le gestionnaire de la table
ne fusionnera pas les blancs dans les index durant la suppréssion, ce qui
peut accélérer certain types de suppressions.
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 .
Le premier format de suppression multi-tables est supporté à partir de MySQL 4.0.0.
Le second format de suppression multi-tables est supporté à partir de MySQL 4.0.2.
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
.
ORDER BY
et l'utilisation de plusieurs tables dans une requête
DELETE
est
supporté en MySQL 4.0.
Si une clause
ORDER BY
est utilisée, les enregistrements seront effacés dans cet ordre.
Ceci n'est vraiment intéressant qu'en conjonction avec
LIMIT
. Par exemple:
DELETE FROM unlog WHERE user = 'jcole' ORDER BY timestamp LIMIT 1
|
Cela effacera la plus vielle entrée (en se basant sur
timestamp
) où
les enregistrements satisfont la clause
WHERE
.
L'option
LIMIT lignes
spécifique à MySQL pour
DELETE
donne au
serveur le nombre maximal de lignes à être effacé avant que le contrôle ne
revienne au client. Cela peut être utilisé pour s'assurer qu'une commande
DELETE
spécifique ne prenne pas trop de temps. Vous pouvez répéter la
commande jusqu'à ce que le nombre de lignes affectées soit inférieur
à la valeur passée à l'option
LIMIT
.
|