mysqldeleteignore_MYSQLDELETE语法详解
单表语法:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
多表语法:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*] ...]
FROM table_references
[WHERE where_definition]
或:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*] ...]
USING table_references
[WHERE where_definition]
tbl_name中有些⾏满⾜由where_definition给定的条件。DELETE⽤于删除这些⾏,并返回被删除的记录的数⽬。
如果您编写的DELETE语句中没有WHERE⼦句,则所有的⾏都被删除。当您不想知道被删除的⾏的数⽬时,有⼀个更快的⽅法,即使⽤TRUNCATE TABLE。
如果您删除的⾏中包括⽤于AUTO_INCREMENT列的最⼤值,则该值被重新⽤于BDB表,但是不会被⽤于MyISAM表或InnoDB表。如果您在AUTOCOMMIT模式下使⽤DELETE FROM tbl_name(不含WHERE⼦句)删除表中的所有⾏,则对于所有的表类型(除InnoDB和MyISAM外),序列重新编排。对于InnoDB表,此项操作有⼀些例外。
对于MyISAM和BDB表,您可以把AUTO_INCREMENT次级列指定到⼀个多列关键字中。在这种情况下,从序列的顶端被删除的值被再次使⽤,甚⾄对于MyISAM表也如此。DELETE语句⽀持以下修饰符:
· 如果您指定LOW_PRIORITY,则DELETE的执⾏被延迟,直到没有其它客户端读取本表时再执⾏。
· 对于MyISAM表,如果您使⽤QUICK关键词,则在删除过程中,存储引擎不会合并索引端结点,这样可以加快部分种类的删除操作的速度。
· 在删除⾏的过程中,IGNORE关键词会使MySQL忽略所有的错误。(在分析阶段遇到的错误会以常规⽅式处理。)由于使⽤本选项⽽被忽略的错误会作为警告返回。
删除操作的速度会受到⼀些因素的影响,这些因素在7.2.18节,“DELETE语句的速度”中进⾏了讨论。
在MyISAM表中,被删除的记录被保留在⼀个带链接的清单中,后续的INSERT操作会重新使⽤旧的记录位置。要重新使⽤未使⽤的空间并减⼩⽂件的尺⼨,则使⽤OPTIMIZE TABLE语句或myisamchk应⽤程序重新编排表。OPTIMIZE TABLE更简便,但是myisamchk速度更快。请参见13.5.2.5节,“OPTIMIZE TABLE语法”和第7章:优化。
QUICK修饰符会影响到在删除操作中索引端结点是否合并。当⽤于被删除的⾏的索引值被来⾃后插⼊
的⾏的相近的索引值代替时,DELETE QUICK最为适⽤。在此情况下,被删除的值留下来的空⽳被重新使⽤。
未充满的索引块跨越某⼀个范围的索引值,会再次发⽣新的插⼊。当被删除的值导致出现未充满的索引块时,DELETE QUICK没有作⽤。在此情况下,使⽤QUICK会导致未利⽤的索引中出现废弃空间。下⾯是此种情况的举例说明:
1. 创建⼀个表,表中包含已编索引的AUTO_INCREMENT列。
2. 在表中插⼊很多记录。每次插⼊会产⽣⼀个索引值,此索引值被添加到索引的⾼端处。
3. 使⽤DELETE QUICK从列的低端处删除⼀组记录。
在此情况下,与被删除的索引值相关的索引块变成未充满的状态,但是,由于使⽤了QUICK,这些索引块不会与其它索引块合并。当插⼊新值时,这些索引块仍为未充满的状态,原因是新记录不含有在被删除的范围内的索引值。另外,即使您此后使⽤DELETE时不包含QUICK,这些索引块也仍是未充满的,除⾮被删除的索引值中有⼀部分碰巧位于这些未充满的块的之中,或与这些块相邻。在这些情况下,如果要重新利⽤未使⽤的索引空间,需使⽤OPTIMIZE TABLE。
如果您打算从⼀个表中删除许多⾏,使⽤DELETE QUICK再加上OPTIMIZE TABLE可以加快速度。这
样做可以重新建⽴索引,⽽不是进⾏⼤量的索引块合并操作。
⽤于DELETE的MySQL唯⼀的LIMIT row_count选项⽤于告知服务器在控制命令被返回到客户端前被删除的⾏的最⼤值。本选项⽤于确保⼀个DELETE语句不会占⽤过多的时间。您可以只重复DELETE语句,直到相关⾏的数⽬少于LIMIT值为⽌。
如果DELETE语句包括⼀个ORDER BY⼦句,则各⾏按照⼦句中指定的顺序进⾏删除。此⼦句只在与LIMIT联⽤是才起作⽤。例如,以下⼦句⽤于查与WHERE⼦句对应的⾏,使⽤timestamp_column进⾏分类,并删除第⼀(最旧的)⾏:
DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp_column
LIMIT 1;
mysql中delete语句您可以在⼀个DELETE语句中指定多个表,根据多个表中的特定条件,从⼀个表或多个表中删除⾏。不过,您不能在⼀个多表DELETE语句中使⽤ORDER BY或LIMIT。
table_references部分列出了包含在联合中的表。此语法在13.2.7.1节,“JOIN语法”中进⾏了说明。
对于第⼀个语法,只删除列于FROM⼦句之前的表中的对应的⾏。对于第⼆个语法,只删除列于FROM⼦句之中(在USING⼦句之前)的表中的对应的⾏。作⽤是,您可以同时删除许多个表中的⾏,并使⽤其它的表进⾏搜索:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
或:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
当搜索待删除的⾏时,这些语句使⽤所有三个表,但是只从表t1和表t2中删除对应的⾏。
以上例⼦显⽰了使⽤逗号操作符的内部联合,但是多表DELETE语句可以使⽤SELECT语句中允许的所有类型的联合,⽐如LEFT JOIN。
本语法允许在名称后⾯加.*,以便与Access相容。
如果您使⽤的多表DELETE语句包括InnoDB表,并且这些表受外键的限制,则MySQL优化程序会对表
进⾏处理,改变原来的从属关系。在这种情况下,该语句出现错误并返回到前⾯的步骤。要避免此错误,您应该从单⼀表中删除,并依靠InnoDB提供的ON DELETE功能,对其它表进⾏相应的修改。
注释:当引⽤表名称时,您必须使⽤别名(如果已给定):
DELETE t1 FROM test AS t1, test2 WHERE ...
进⾏多表删除时⽀持跨数据库删除,但是在此情况下,您在引⽤表时不能使⽤别名。举例说明:
p1, p2 p1, p2 WHERE ...
⽬前,您不能从⼀个表中删除,同时⼜在⼦查询中从同⼀个表中选择。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论