Maison  >  Article  >  base de données  >  Tutoriel de base de MySQL 15 — Déclaration d'opération de données de syntaxe SQL DML — Syntaxe DELETE

Tutoriel de base de MySQL 15 — Déclaration d'opération de données de syntaxe SQL DML — Syntaxe DELETE

黄舟
黄舟original
2017-02-24 11:59:061304parcourir

Syntaxe de table unique :

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT row_count]

Syntaxe de tables multiples :

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*] ...]
    FROM table_references    [WHERE where_definition]

ou :

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*] ...]
    USING table_references    [WHERE where_definition]

tbl_name Il y a des lignes qui satisfont aux conditions données par where_definition. DELETE est utilisé pour supprimer ces lignes et renvoie le nombre d'enregistrements supprimés.

Si vous écrivez une instruction DELETE sans clause WHERE, toutes les lignes seront supprimées. Lorsque vous ne souhaitez pas connaître le nombre de lignes supprimées, il existe un moyen plus rapide, qui consiste à utiliser TRUNCATE TABLE.

Si la ligne que vous supprimez inclut la valeur maximale de la colonne AUTO_INCREMENT, cette valeur est réutilisée dans la table BDB, mais pas dans la table MyISAM ou la table InnoDB. Si vous utilisez DELETE FROM tbl_name (sans clause WHERE) en mode AUTOCOMMIT pour supprimer toutes les lignes d'une table, la séquence est réorganisée pour tous les types de table (sauf InnoDB et MyISAM).

Pour les tables MyISAM et BDB, vous pouvez spécifier la colonne secondaire AUTO_INCREMENT dans un mot-clé multi-colonnes. Dans ce cas, la valeur supprimée du haut de la séquence est à nouveau utilisée, même pour les tables MyISAM.

L'instruction DELETE prend en charge les modificateurs suivants :

· Si vous spécifiez LOW_PRIORITY, l'exécution de DELETE est retardée jusqu'à ce qu'aucun autre client ne lise cette table.

· Pour les tables MyISAM, si vous utilisez le mot-clé QUICK, le moteur de stockage ne fusionnera pas les nœuds de fin d'index pendant le processus de suppression, ce qui peut accélérer certains types d'opérations de suppression.

· Pendant le processus de suppression de lignes, le mot-clé IGNORE fait que MySQL ignore toutes les erreurs. (Les erreurs rencontrées lors de la phase d'analyse sont traitées de la manière normale.) Les erreurs ignorées en raison de l'utilisation de cette option sont renvoyées sous forme d'avertissements.

Dans les tables MyISAM, les enregistrements supprimés sont conservés dans une liste chaînée et les opérations INSERT ultérieures réutiliseront l'ancien emplacement de l'enregistrement. Pour réutiliser l'espace inutilisé et réduire la taille du fichier, utilisez l'instruction OPTIMIZE TABLE ou l'application myisamchk pour réorganiser la table. OPTIMIZE TABLE est plus simple, mais myisamchk est plus rapide.

Le modificateur QUICK affectera si les nœuds de fin d'index sont fusionnés lors de l'opération de suppression. DELETE QUICK est particulièrement utile lorsque la valeur d'index de la ligne supprimée est remplacée par une valeur d'index similaire provenant d'une ligne insérée ultérieurement. Dans ce cas, les trous laissés par les valeurs supprimées sont réutilisés.

Si le bloc d'index qui n'est pas plein couvre une certaine plage de valeurs d'index, une nouvelle insertion se produira. DELETE QUICK n'a aucun effet lorsque la valeur supprimée entraîne un bloc d'index sous-rempli. Dans ce cas, l'utilisation de QUICK peut entraîner une perte d'espace dans les index inutilisés. Voici un exemple de cette situation :

1. Créez une table contenant la colonne AUTO_INCREMENT indexée.

2. Insérez plusieurs enregistrements dans le tableau. Chaque insertion produit une valeur d'index, qui est ajoutée à l'extrémité supérieure de l'index.

3. Utilisez DELETE QUICK pour supprimer un groupe d'enregistrements du bas de la colonne.

Dans ce cas, les blocs d'index liés aux valeurs d'index supprimées deviennent sous-remplis, mais en raison de l'utilisation de QUICK, ces blocs d'index ne sont pas fusionnés avec d'autres blocs d'index. Lorsque de nouvelles valeurs sont insérées, ces blocs d'index restent sous-remplis car les nouveaux enregistrements ne contiennent pas de valeurs d'index dans la plage supprimée. De plus, même si vous utilisez ultérieurement DELETE sans inclure QUICK, ces blocs d'index ne seront toujours pas remplis, à moins que certaines des valeurs d'index supprimées ne se trouvent dans ou à côté de ces blocs non remplis. Dans ces cas, si vous souhaitez réutiliser l'espace d'index inutilisé, utilisez OPTIMIZE TABLE.

Si vous envisagez de supprimer plusieurs lignes d'un tableau, l'utilisation de DELETE QUICK associée à OPTIMIZE TABLE peut accélérer les choses. Cela réindexe plutôt que d’effectuer un grand nombre d’opérations de fusion de blocs d’index.

L'option LIMIT unique de MySQL pour DELETE row_count est utilisée pour indiquer au serveur le nombre maximum de lignes pouvant être supprimées avant que la commande de contrôle ne soit renvoyée au client. Cette option est utilisée pour garantir qu'une instruction DELETE ne prend pas trop de temps. Vous pouvez simplement répéter l'instruction DELETE jusqu'à ce que le nombre de lignes pertinentes soit inférieur à la valeur LIMIT.

Si l'instruction DELETE inclut une clause ORDER BY, les lignes sont supprimées dans l'ordre spécifié dans la clause. Cette clause ne fonctionne que lorsqu'elle est utilisée conjointement avec LIMIT. Par exemple, la clause suivante est utilisée pour rechercher les lignes correspondant à la clause WHERE, utiliser timestamp_column pour la classification et supprimer la première ligne (la plus ancienne) :

DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp_column
LIMIT 1;

Vous pouvez spécifier plusieurs instructions DELETE dans une seule table, supprimez des lignes d'une ou de plusieurs tables en fonction de conditions spécifiques dans plusieurs tables. Toutefois, vous ne pouvez pas utiliser ORDER BY ou LIMIT dans une instruction DELETE multi-table. La section

table_references répertorie les tables incluses dans l'union.

Pour la première syntaxe, seules les lignes correspondantes du tableau répertoriées avant la clause FROM sont supprimées. Pour la deuxième syntaxe, seules les lignes correspondantes du tableau répertoriées dans la clause FROM (avant la clause USING) sont supprimées. La fonction est que vous pouvez supprimer des lignes dans plusieurs tables en même temps et utiliser d'autres tables pour rechercher :

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;

Lors de la recherche de lignes à supprimer, Ces instructions utilisent les trois tables, mais suppriment uniquement les lignes correspondantes des tables t1 et t2.

以上例子显示了使用逗号操作符的内部联合,但是多表DELETE语句可以使用SELECT语句中允许的所有类型的联合,比如LEFT JOIN。

本语法允许在名称后面加.*,以便与Access相容。

如果您使用的多表DELETE语句包括InnoDB表,并且这些表受外键的限制,则MySQL优化程序会对表进行处理,改变原来的从属关系。在这种情况下,该语句出现错误并返回到前面的步骤。要避免此错误,您应该从单一表中删除,并依靠InnoDB提供的ON DELETE功能,对其它表进行相应的修改。

注释:当引用表名称时,您必须使用别名(如果已给定):

DELETE t1 FROM test AS t1, test2 WHERE ...

进行多表删除时支持跨数据库删除,但是在此情况下,您在引用表时不能使用别名。举例说明:

DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...

目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。

 以上就是MySQL基础教程15 —— SQL语法之数据操作语句DML——DELETE语法的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn