详细分析MySQL删除语法。
单表语法:
复制代码代码如下所示:
删除{ } { } { low_priority快速从tbl_name忽略}
where_definition {在}
{由…订购}
{极限row_count }
多表语法:
复制代码代码如下所示:
删除{ } { } { low_priority快忽略}
tbl_name { *。} {,tbl_name {。* }…}
从table_references
where_definition {在}
或:
复制代码代码如下所示:
删除{ } { } { low_priority快忽略}
从tbl_name {,} {,tbl_name {。* }…}
使用table_references
where_definition {在}
在tbl_name一些线,符合条件的where_definition.mysql删除用于删除这些行并返回删除的记录数。
如果在删除语句中没有WHERE子句,则删除所有行。当您不想知道已删除行的数目时,使用截断表有一个更快的方法。
如果行你删除包括对auto_increment列的最大值,该值是在BDB表重复使用,但不将其用于MyISAM表或InnoDB表。如果你删除表中的所有行进行删除tbl_name(没有WHERE子句)的AUTOCOMMIT模式,顺序重新排列除InnoDB和MyISAM表的所有类型。对于InnoDB表,有这个操作的一些例外。
对于MyISAM和BDB表,您可以将auto_increment二栏多栏的关键词。在这种情况下,这是从顶部的序列删除的值被再次使用,甚至对于MyISAM表,删除语句支持下列修饰符:
如果你指定low_priority,删除的执行被延迟直到没有其他客户端读取该表。
对于MyISAM表,如果你使用快速关键词,删除过程中,存储引擎将不合并指数结束节点,这样可以加快一些速度删除操作。
在删除一行的过程中,忽略关键字使MySQL忽略所有错误。(分析阶段遇到的错误以常规方式处理)。由于使用此选项而忽略的错误将作为警告返回。
删除操作速度受多种因素的影响,这是在7.2.18段速度的影响,MySQL删除语句。
在MyISAM表,删除的记录保存在一个列表的链接,以及后续的插入操作重用旧的记录位置,利用未使用的空间,减少文件的大小,重新排列表使用优化表的语句或myisamchk application.optimize表容易,但myisamchk更快。请看13.5.2.5部分,优化表的语法和第七章:优化。
快速修改影响合并索引的端节点在删除operation.delete快速最适用,当指标值为删除的行被插入后,插入的行类似的指标值所取代。在这种情况下,留下的空洞被删除的值重复使用。
在一定范围内的索引值执行索引块,插入一个新的会发生again.delete快不工作时被删除的值导致一个空缺的索引块的出现。在这种情况下,快速导致在未使用的索引到一个废弃的空间使用。以下是这种情况的一个例子:
1。创建一个索引auto_increment列在表。
2。在表中插入大量记录。每个插入产生一个索引值,该值被添加到索引的高端。
三.使用快速删除从列的下端删除一组记录。
在这种情况下,与删除的索引值相关的索引块变得不填充。然而,由于快速的使用,这些索引块不会与其他索引块合并。当新值插入,索引块仍然空缺,因为新的记录不包含索引值在被删除的范围。另外,即使你不使用MySQL删除后快速,这些索引块还没有填充除非一些被删除的索引值恰好位于这些填充块或相邻的块。在这些情况下,如果你想利用未使用的索引,你需要使用优化表。
如果要删除一个表中的许多行,使用快速删除和优化表可以加快速度。这样,索引可以重建,而不是大量的索引块合并操作。
唯一的限制row_count选择MySQL的删除通知服务器,在控制命令返回到客户端删除的行的最大值。这个选项是用来确保删除语句没有花太多时间。你可以重复的删除语句直到相关线数小于极限值。
如果删除语句包含的条款顺序,排在子句中指定的顺序删除。本条款只适用与限制。例如,用一句找到一个对应一个WHERE子句,将与timestamp_column,删除第一个(最早的)线:
复制代码代码如下所示:
删除从somelog
其中用户= 'jcole
为了timestamp_column
限制1;
可以根据多个表中的特定条件,在删除语句中指定多个表,并从表或多表中删除行。但是,不能在多表删除语句中使用顺序或限制。
的table_references部分列出了包含在联邦表。这种语法在13.2.7.1部分解释,加入语法。
对于第一个语法,只有在from子句之前列出的表中相应的行被删除。对于第二个语法,仅删除from子句(在使用子句之前)中表中相应的行。其效果是可以同时删除多个表中的行,并使用其他表进行搜索:
复制代码代码如下所示:
删除T1、T2与T1,T2,T3,T1和T2。ID = t2.id ID = t3.id;
或:
复制代码代码如下所示:
删除从T1,T2,T3 T2使用T1,T1和T2。ID = t2.id ID = t3.id;
在搜索要删除的行时,这些语句使用所有三个表,但只从表t1和表T2中删除相应的行。
上面的例子显示了使用逗号操作符的内部联合,但是多表MySQL删除语句可以使用SELECT语句中允许的各种组合,如左连接。
这允许名称中的语法。为了添加,兼容访问。
如果您使用多台MySQL删除报表,包括InnoDB表,这些表通过外键约束,MySQL的优化器将流程表和改变原来的隶属关系。在这种情况下,这种说法是错误的,返回到上一步。为了避免这种错误,你应该删除从一个单一的表和依赖在删除了InnoDB修改其他表的功能。
注意:当引用表的名称时,必须使用别名(如果给定的话):
复制代码代码如下所示:
删除T1测试T1,test2的地方…
当进行多个表删除时,支持跨数据库删除,但在这种情况下,在引用表时不能使用别名:
复制代码代码如下所示:
删除test1.tmp1,test2.tmp2从test1.tmp1,test2.tmp2哪里…
此刻,你不能删除从一个表中查询来自同一个表中选择。