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_priority,update 的执行将被延迟,直到没有其它的客户端正在读取表。
如果你指定关键词 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 by 或 limit。
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]
delete 从 table_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_priority,delete 的执行将被延迟,直到没有其它的客户端正在读取表。
如果你指定关键词 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 开始被支持。