MySQL 4.1.0 中文参考手册 --- 6.4 数据操纵:SELECT, INSERT, UPDATE, DELETE[7]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 shuixin13 的 blog

  • 处理器线程在 mysql 进程列表中的 command 列上显示为 delayed_insert。如果执行一个 flush tables 命令或以 kill thread_id 杀死它,它将会被杀死。然而,它在退出前会首先将所队列记录行保存到表中。这些期间,它将不再接收其它线程的任何新的 insert 命令。如果再此之后执行一个 insert delayed 命令,一个新处理器线程将会被创建。 注意,上面的意思是,如果一个 insert delayed 处理器已在运行,那么 insert delayed 命令将有比正常 insert 命令更高的优先级!其它的更新命令将不得不等到 insert delayed 队列被清空,杀死处理器线程(以 kill thread_id) 或执行 flush tables

  • 下列状态变量提供了有关 insert delayed 命令的信息:
    变量 含义
    delayed_insert_threads 处理器线程数目
    delayed_writes 使用 insert delayed 写入的记录行的数目
    not_flushed_delayed_rows 等待被写入的记录行数目
    通过发出一个 show status 语句或通过执行一个 mysqladmin extended-status 命令,你可以查看这些变量。

    注意,如果表没有在使用中,insert delayed 将比一个正常的 insert 慢。让服务器为你使用 insert delayed 的每张表处理一个单独的线程,也是有额外的开销的。这就意味着,你应该在确定你的确需要它时才使用 insert delayed

    6.4.5 update 句法

    update [low_priority] [ignore] tbl_name
        set col_name1=expr1 [, col_name2=expr2 ...]
        [where where_definition]
        [order by ...]
        [limit rows]
    or
    update [low_priority] [ignore] tbl_name [, tbl_name ...]
        set col_name1=expr1 [, col_name2=expr2 ...]
        [where where_definition]
    

    update 以新的值更新现存表中行的列。set 子句指出要修改哪个列和他们应该给定的值。where 子句如果被给出,指定哪个记录行应该被更新。否则,所有的记录行被更新。如果 order by 子句被指定,记录行将被以指定的次序更新。

    如果你指定关键词 low_priorityupdate 的执行将被延迟,直到没有其它的客户端正在读取表。

    如果你指定关键词 ignore,该更新语句将不会异常中止,即使在更新过程中出现重复键错误。导致冲突的记录行将不会被更新。

    如果在一个表达式中从 tbl_name 中访问一个列,update 使用列的当前值。举例来说,下面的语句设置 age 列值为它的当前值加 1 :

    mysql> update persondata set age=age+1;
    

    update 赋值是从左到右计算的。举例来说,下列语句将 age 列设置为它的两倍,然后再加 1 :

    mysql> update persondata set age=age*2, age=age+1;
    

    如果你设置列为其当前的值,mysql 注意到这点,并不更新它。

    update 返回实际被改变的记录行数目。在 mysql 3.22 或更新的版本中,c api 函数 mysql_info() 返回被匹配并更新的记录行数目,以及在 update 期间发生的警告的数目。

    在 mysql 3.23 中,你可以使用 limit # 来确保只有给定的记录行数目被更改。

    如果一个 order by 子句被使用(从 mysql 4.0.0 开始支持),记录行将以指定的次序被更新。这实际上只有连同 limit 一起才有用。

    从 mysql 4.0.4 开始,你也可以执行一个包含多个表的 update 的操作:

    update items,month set items.price=month.price
    where items.id=month.id;
    

    注意:多表 update 不可以使用 order bylimit

    6.4.6 delete 句法

    delete [low_priority] [quick] from table_name
           [where where_definition]
           [order by ...]
           [limit rows]
    or
    delete [low_priority] [quick] table_name[.*] [, table_name[.*] ...]
           from table-references
           [where where_definition]
    or
    delete [low_priority] [quick]
           from table_name[.*] [, table_name[.*] ...]
           using table-references
           [where where_definition]
    

    deletetable_name 中删除 where_definition 中给定条件的记录行,并返回删除的记录数目。

    如果你发出一个没有 where 子句的 delete,所有的记录行将被删除。如果你以 autocommit 模式执行它,那么它类似于 truncate。查看章节 6.4.7 truncate 句法。在 mysql 3.23 中,没有一个 where 子句的 delete 将返回零作为受影响的记录数目。

    当你删除所有记录行时,如果你真的希望知道多少条记录被删除,你可以使用一个这种形式的 delete 语句:

    mysql> delete from table_name where 1>0;
    

    注意,这将比一个没有 where 子句的 delete from table_name 语句慢,因为它一次只删除一行。

    如果你指定关键词 low_prioritydelete 的执行将被延迟,直到没有其它的客户端正在读取表。

    如果你指定关键词 quick,那么在删除过程中存储引擎将不会归并索引叶,这可能会加速某些类型的删除操作。

    myisam 表中,删除了的记录被放在一个链接表中维护,以后的 insert 操作将重新使用删除后的记录位置。为了回收闲置的空间,并减小文件尺寸,使用 optimize table 语句或 myisamchk 实用程序重新组织表。optimize table 使用比较容易,但是 myisamchk 更快点。查看章节 4.5.1 optimize table 句法 和章节 4.4.6.10 表优化

    第一个多表删除格式从 mysql 4.0.0 开始被支持。第二个多表删除格式从 mysql 4.0.2 开始被支持。

  • 本文关键:MySQL 4.1.0 中文
     

    本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

    go top