10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 41.2 mb
PDF (A4)- 41.3 mb
PDF (RPM)- 39.5 mb
HTML下载(TGZ)- 9.3 mb
HTML下载(Zip)- 9.3 mb
HTML下载(RPM)- 7.8 mb
手册(TGZ)- 260.6 kb
手册(Zip)- 371.8 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

13.2.2 DELETE语句

删除是从表中删除行的DML语句。

一个删除语句可以以a开头子句中定义可访问的公共表表达式删除.看到第13.2.15节“WITH(常用表表达式)”

文档的语法

删除[low_priority] [quick] [ignore] fromtbl_name[[是]tbl_alias分区(partition_name[,partition_name…)[在where_condition[由…][限制row_count

删除语句从tbl_name并返回已删除的行数。方法可检查已删除的行数ROW_COUNT ()功能描述于第12.16条“资讯功能”

主要条款

可选选项中的条件在哪里子句标识要删除的行。没有在哪里子句,将删除所有行。

where_condition对于要删除的每一行,该表达式的计算值为true。中描述的那样指定第13.2.10节," SELECT语句"

如果命令子句,则按指定的顺序删除行。的限制子句对可删除的行数进行限制。这些子句适用于单表删除,但不适用于多表删除。

多个表的语法

删除[low_priority] [quick] [ignore]tbl_name(。*] [,tbl_name(。*]]…从table_references(在哪里where_conditiondelete [low_priority] [quick] [ignore] fromtbl_name(。*] [,tbl_name(。*]]…使用table_references(在哪里where_condition

特权

你需要删除权限从表中删除行。您只需要选择控件中命名的任何列的特权在哪里条款。

性能

当您不需要知道已删除的行数时,可以使用截断表语句是清空表的一种更快的方法删除带有no的语句在哪里条款。不像删除截断表不能在事务中使用,也不能在表上有锁时使用。看到第13.1.37节," TRUNCATE TABLE语句"而且第13.3.6节,“LOCK TABLES和UNLOCK TABLES语句”

删除操作的速度也可能受到中讨论的因素的影响第8.2.5.3节“优化DELETE语句”

以保证给定的删除语句不会花费太多时间,mysql特有的限制row_count条款删除指定要删除的最大行数。如果要删除的行数大于限制,请重复删除语句,直到受影响的行数小于限制价值。

子查询

不能在子查询中从表中删除并从同一表中进行选择。

分区表支持

删除方法支持显式分区选择分区子句,它接受一个或多个分区或子分区(或两个)名称的列表,从这些名称中选择要删除的行。列表中未包含的分区将被忽略。给定一个分区表t有一个名为p0,执行语句删除t分区(p0)对表的影响与执行相同修改表截断分区(p0);在这两种情况下,分区中的所有行p0是下降了。

分区可以和在哪里条件,在这种情况下,只在列出的分区中的行上测试条件。例如,删除c < 5的分区只从分区中删除行p0这种情况下C < 5是真的;属性不会检查任何其他分区中的行,因此不会受到删除

分区子句也可以用在多表中删除语句。类中命名的每个表最多可以使用一个这样的选项选择。

有关更多信息和示例,请参见第24.5节,“分区选择”

自动递增列

参数的最大值所在行AUTO_INCREMENT列时,该值不会被重用MyISAMInnoDB表格如果删除表中的所有行删除从tbl_name(没有一个在哪里条款)自动提交模式下,除InnoDB而且MyISAM.对于这种行为有一些例外InnoDB表,如中所述第15.6.1.6节“InnoDB中的AUTO_INCREMENT处理”

MyISAM表中,您可以指定AUTO_INCREMENT多列键中的辅助列。在这种情况下,从序列顶部删除的值也会重用MyISAM表。看到第3.6.9节“使用AUTO_INCREMENT”

修饰符

删除语句支持以下修饰符:

  • 如果指定LOW_PRIORITY修饰符时,服务器将延迟删除直到没有其他客户机从表中读取。这只影响只使用表级锁的存储引擎(例如MyISAM内存,合并).

  • MyISAM表,如果您使用快速修饰符,存储引擎在删除期间不合并索引叶,这可能会加快某些类型的删除操作。

  • 忽略modifier导致MySQL在删除行过程中忽略可忽略的错误。(在解析阶段遇到的错误将以通常的方式处理。)的使用而被忽略的错误忽略作为警告返回。有关更多信息,请参见IGNORE对语句执行的影响

删除令

如果删除语句包含命令子句,则按子句指定的顺序删除行。这主要是与限制.例如,以下语句查找与在哪里子句对它们进行排序timestamp_column,并删除第一个(最老的):

删除用户为“jcole”的日志

命令还有助于按避免引用完整性违反所需的顺序删除行。

InnoDB表

如果要从一个大表中删除许多行,则可能超过锁表的大小InnoDB表格为了避免这个问题,或者简单地减少表保持锁定的时间,下面的策略(不使用删除)可能会有帮助:

  1. 选择行被删除到与原表结构相同的空表中:

    INSERT INTO t_copy SELECT * FROM…;
  2. 使用重命名表自动移动原表,并将副本重命名为原名称:

    重命名表t为t_old, t_copy为t
  3. 删除原来的表:

    删除表t_old;

时,没有其他会话可以访问所涉及的表重命名表执行,因此重命名操作不会受到并发性问题的影响。看到第13.1.36节,“RENAME TABLE语句”

MyISAM表

MyISAM表、删除的行在链表及其后续表中维护插入操作重用旧的行位置。要回收未使用的空间并减小文件大小,请使用优化表声明或myisamchk用于重新组织表的实用程序。优化表更容易使用,但是myisamchk更快。看到第13.7.3.4节,“优化表语句”,章节4.6.4,“myisamchk - MyISAM表维护工具”

快速修饰符影响是否合并索引叶以进行删除操作。快速删除对于被删除行的索引值将被稍后插入行的类似索引值所替换的应用程序最有用。在本例中,重用被删除值留下的空洞。

快速删除当删除的值导致索引块填充不足,索引块跨越了一个索引值范围,为这些索引值再次进行新插入时,则不有用。在这种情况下,使用快速可能导致索引中未回收的空间被浪费。下面是这样一个场景的例子:

  1. 创建一个包含索引的表AUTO_INCREMENT列。

  2. 向表中插入许多行。每次插入都会产生一个索引值,该值被添加到索引的高端。

  3. 使用删除列范围低端的行块快速删除

在这种情况下,与已删除的索引值相关联的索引块变得不足填充,但由于使用了快速.当发生新的插入时,它们仍然处于未填充状态,因为新行在删除的范围内没有索引值。此外,即使您以后使用它们,它们仍然是未填充的删除没有快速,除非某些被删除的索引值恰好位于未填充块内部或相邻的索引块中。要在这些情况下回收未使用的索引空间,请使用优化表

如果要从表中删除许多行,使用它可能会更快快速删除紧随其后的是优化表.这将重新构建索引,而不是执行许多索引块合并操作。

多表删除

中可以指定多个表删除控件中的条件从一个或多个表中删除行在哪里条款。你不能使用命令限制在多重表中删除.的table_references子句列出联接所涉及的表,如中所述第13.2.10.2节“联接条款”

对于第一种多表语法,只匹配前面列出的表中的行子句被删除。对于第二种多表语法,只匹配中列出的表中的行条款(在使用子句)被删除。这样做的效果是,你可以同时从多个表中删除行,并拥有只用于搜索的附加表:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2id AND t2.id=t3.id;

或者:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2id AND t2.id=t3.id;

这些语句在搜索要删除的行时使用所有三个表,但只从表中删除匹配的行t1而且t2

前面的示例使用内连接,但多桌删除语句可以使用允许的其他类型的连接选择语句,例如左连接.例如,删除存在的行t1没有对手t2,使用左连接

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2。id WHERE t2。id为NULL;

语法允许.*在每一个tbl_name为了兼容访问

如果你用的是多桌删除声明中涉及InnoDB对于有外键约束的表,MySQL优化器可能会以不同于它们的父/子关系的顺序处理表。在这种情况下,语句失败并回滚。相反,您应该从单个表中删除并依赖于在删除功能,InnoDB使其他表相应修改。

请注意

如果你为一个表声明了别名,你必须在引用该表时使用别名:

删除t1 FROM test AS t1, WHERE…

多表中的表别名删除应该只在table_references陈述的一部分。在其他地方,允许别名引用,但不允许别名声明。

正确的:

删除a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.idWHERE a1.id=a2.id; WHERE a1.id=a2.id;

不正确的:

删除t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2 WHERE a1.id=a2.id;删除t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2 WHERE a1.id=a2.id;

单表也支持表别名删除MySQL 8.0.16开头的语句。(Bug #89410,Bug #27455809)