sql delete删除语句详细语法

delete语法
单表语法:

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。请参见13.2.9节,“truncate语法”。

如果您删除的行中包括用于auto_increment列的最大值,则该值被重新用于bdb表,但是不会被用于myisam表或innodb表。如果您在autocommit模式下使用delete from tbl_name(不含where子句)删除表中的所有行,则对于所有的表类型(除innodb和myisam外),序列重新编排。对于innodb表,此项操作有一些例外,在15.2.6.3节,“auto_increment列如何在innodb中运行”中进行了讨论。

对于myisam和bdb表,您可以把auto_increment次级列指定到一个多列关键字中。在这种情况下,从序列的顶端被删除的值被再次使用,甚至对于myisam表也如此。请参见3.6.9节,“使用auto_increment”。

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 somelogwhere user = 'jcole'order by timestamp_columnlimit 1;您可以在一个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 ...进行多表删除时支持跨数据库教程删除,但是在此情况下,您在引用表时不能使用别名。举例说明:

delete test1.tmp1, test2.tmp2 from test1.tmp1, test2.tmp2 where ...目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。

时间: 2024-09-20 12:14:47

sql delete删除语句详细语法的相关文章

sql数据删除语句

SQL语言中用于删除数据库中某个关系表中的数据的语句是DELETE.它可用于完成删除一关系表中一行或若干行,甚至全部行的操作.其使用格式如下: DELETE FROM <表名> [WHERE<搜索条件>] 这里WHERE子句中的搜索条件,同样容许含有另一个SELECT查询语句. 参考资料:sql语言教程 Sql语言基础 返回"数据库基础知识ABC"目录

SQL Server UPDATE语句的用法详解_MsSql

SQL Server UPDATE语句用于更新数据,下面就为您详细介绍SQL Server UPDATE语句语法方面的知识,希望可以让您对SQL Server UPDATE语句有更多的了解. 现实应用中数据库中的数据改动是免不了的.通常,几乎所有的用户数据库中的大部分数据都要进行某种程度的修改.在SQL Server数据库中要想修改数据库记录,就需要用UPDATE语句,UPDATE语句就是为了改变数据库中的现存数据而存在的.这条语句虽然有一些复杂的选项,但确实是最容易学习的语句之一.这是因为在大

SQL Server UPDATE语句的用法详解

SQL Server UPDATE语句用于更新数据,下面就为您详细介绍SQL Server UPDATE语句语法方面的知识,希望可以让您对SQL Server UPDATE语句有更多的了解. 现实应用中数据库中的数据改动是免不了的.通常,几乎所有的用户数据库中的大部分数据都要进行某种程度的修改.在SQL Server数据库中要想修改数据库记录,就需要用UPDATE语句,UPDATE语句就是为了改变数据库中的现存数据而存在的.这条语句虽然有一些复杂的选项,但确实是最容易学习的语句之一.这是因为在大

Oracle DELETE删除记录sql语句用法

  语法与其它的sql数据库教程是一样的,如下 DELETE FROM COURSES WHERE COURSE_DESIGNATER = 'Java110' 按条件比较复杂的操作方法 DELETE FROM CLASSCONVENINGS WHERE CLASSES_NUM_FK > 4 AND CLASS_CONVENE_DATE = TO_DATE('2006-02-15 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND CLASS_LOCATION_FK =

sql delete语句及同时删除多表数据实现方法

sql delete语句及同时删除多表数据实现方法 delete     [ from ]         { table_name with ( < table_hint_limited > [ ...n ] )          | view_name          | rowset_function_limited         }         [ from { < table_source > } [ ,...n ] ]     [ where         {

SQL的详细语法介绍——对于学习数据库最基础知识一

数据|数据库|语法 Select用途:  从指定表中取出指定的列的数据 语法:   SELECT column_name(s) FROM table_name   解释: 从数据库中选取资料列,并允许从一或多个资料表中,选取一或多个资料列或资料行.SELECT 陈述式的完整语法相当复杂,但主要子句可摘要为: SELECT select_list [ INTO new_table ] FROM table_source [ WHERE search_condition ] [ GROUP BY g

Oracle数据库删除语句DELETE的一般性用法

语法与其它的sql数据库教程是一样的,如下 DELETE FROM COURSES WHERE  COURSE_DESIGNATER = 'Java110' 按条件比较复杂的操作方法 DELETE FROM CLASSCONVENINGS WHERE      CLASSES_NUM_FK      > 4    AND CLASS_CONVENE_DATE = TO_DATE('2006-02-15 00:00:00',                                    '

sql 删除语句

sql 删除语句 一般简单的删除数据记录用delete就行了,但是如何要删除复杂的外键就不是一条delete删除来实例的,我们本文章先讲一下delete删除,然后再告诉你利用触发器删除多条记录多个表. 删除数据库教程中的数据 delete from 语句用于从数据库表中删除记录. 语法 delete from table_name where column_name = some_value */ $con = mysql教程_connect("localhost","pet

sql server ql语句删除外键和删除

sql server ql语句删除外键和删除 alter   table   tablename   add   constraint   ordersrelationship                           foreign   key   mployeeid       references   employees   (employeeid)                           on   delete     cascade