⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 06-4.html

📁 MySQL4.1.0 中文参考手册
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<LI>
当处理器发现在它的队列中没有太多的记录行时,表将被解锁。如果在 <CODE>delayed_insert_timeout</CODE> 秒内没有接收到新的 <CODE>INSERT DELAYED</CODE> 命令,处理器线程将终止。

<P></P>

<LI>
如果在一个特定的处理器队列中已有超过 <CODE>delayed_queue_size</CODE> 个记录行未被解决,线程要求 <CODE>INSERT DELAYED</CODE> 等待,只到在队列中有可用空间。这样做是为了保证 <CODE>mysqld</CODE> 服务器对延迟内存队列不使用全部的内存。

<P></P>

<LI>
处理器线程在 MySQL 进程列表中的 <CODE>Command</CODE> 列上显示为 <CODE>delayed_insert</CODE>。如果执行一个 <CODE>FLUSH TABLES</CODE> 命令或以 <CODE>KILL thread_id</CODE> 杀死它,它将会被杀死。然而,它在退出前会首先将所队列记录行保存到表中。这些期间,它将不再接收其它线程的任何新的 <CODE>INSERT</CODE> 命令。如果再此之后执行一个 <CODE>INSERT
DELAYED</CODE> 命令,一个新处理器线程将会被创建。

注意,上面的意思是,如果一个 <CODE>INSERT DELAYED</CODE> 处理器已在运行,那么 <CODE>INSERT DELAYED</CODE> 命令将有比正常 <CODE>INSERT</CODE> 命令更高的优先级!其它的更新命令将不得不等到 <CODE>INSERT DELAYED</CODE> 队列被清空,杀死处理器线程(以 <CODE>KILL thread_id</CODE>) 或执行 <CODE>FLUSH TABLES</CODE>。

<P></P>

<LI>
下列状态变量提供了有关 <CODE>INSERT DELAYED</CODE> 命令的信息:

<TABLE BORDER WIDTH="90%">
<TR><TD><STRONG>变量 </STRONG> </TD><TD> <STRONG>含义 </STRONG>
</TD></TR>
<TR><TD><CODE>Delayed_insert_threads</CODE> </TD><TD> 处理器线程数目
</TD></TR>
<TR><TD><CODE>Delayed_writes</CODE> </TD><TD> 使用 <CODE>INSERT DELAYED</CODE> 写入的记录行的数目
</TD></TR>
<TR><TD><CODE>Not_flushed_delayed_rows</CODE> </TD><TD> 等待被写入的记录行数目
</TD></TR>
</TABLE>

通过发出一个 <CODE>SHOW STATUS</CODE> 语句或通过执行一个 <CODE>mysqladmin extended-status</CODE> 命令,你可以查看这些变量。
</UL>

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



<H3><A NAME="UPDATE"></A>6.4.5  <CODE>UPDATE</CODE> 句法</H3>

<P>
<A NAME="IDX1437"></A>

</P>

<PRE>
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]
</PRE>

<P>
<CODE>UPDATE</CODE> 以新的值更新现存表中行的列。<CODE>SET</CODE> 子句指出要修改哪个列和他们应该给定的值。<CODE>WHERE</CODE> 子句如果被给出,指定哪个记录行应该被更新。否则,所有的记录行被更新。如果 <CODE>ORDER BY</CODE> 子句被指定,记录行将被以指定的次序更新。
</P>

<P>
如果你指定关键词 <CODE>LOW_PRIORITY</CODE>,<CODE>UPDATE</CODE> 的执行将被延迟,直到没有其它的客户端正在读取表。
</P>
<P>
如果你指定关键词 <CODE>IGNORE</CODE>,该更新语句将不会异常中止,即使在更新过程中出现重复键错误。导致冲突的记录行将不会被更新。
</P>

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

<PRE>
mysql&#62; UPDATE persondata SET age=age+1;
</PRE>

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

</P>

<PRE>
mysql&#62; UPDATE persondata SET age=age*2, age=age+1;
</PRE>

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

<P>
<A NAME="IDX1438"></A>
<CODE>UPDATE</CODE> 返回实际被改变的记录行数目。在 MySQL 3.22 或更新的版本中,C API 函数 <CODE>mysql_info()</CODE>
返回被匹配并更新的记录行数目,以及在 <CODE>UPDATE</CODE> 期间发生的警告的数目。
</P>

<P>
在 MySQL 3.23 中,你可以使用 <CODE>LIMIT #</CODE> 来确保只有给定的记录行数目被更改。
</P>

<P>
如果一个 <CODE>ORDER BY</CODE> 子句被使用(从 MySQL 4.0.0 开始支持),记录行将以指定的次序被更新。这实际上只有连同 <CODE>LIMIT</CODE> 一起才有用。
</P>
<P>
从 MySQL 4.0.4 开始,你也可以执行一个包含多个表的 <CODE>UPDATE</CODE> 的操作:
</P>

<PRE>
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
</PRE>

<P>
注意:多表 <CODE>UPDATE</CODE> 不可以使用 <CODE>ORDER BY</CODE> 或 <CODE>LIMIT</CODE>。
</P>



<H3><A NAME="DELETE"></A>6.4.6  <CODE>DELETE</CODE> 句法</H3>

<P>
<A NAME="IDX1439"></A>

</P>

<PRE>
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]
</PRE>

<P>
<CODE>DELETE</CODE> 从 <CODE>table_name</CODE> 中删除 <CODE>where_definition</CODE> 中给定条件的记录行,并返回删除的记录数目。
</P>

<P>
如果你发出一个没有 <CODE>WHERE</CODE> 子句的 <CODE>DELETE</CODE>,所有的记录行将被删除。如果你以 <CODE>AUTOCOMMIT</CODE> 模式执行它,那么它类似于 <CODE>TRUNCATE</CODE>。查看章节 <A HREF="06-4.html#TRUNCATE">6.4.7  <CODE>TRUNCATE</CODE> 句法</A>。在 MySQL 3.23 中,没有一个 <CODE>WHERE</CODE> 子句的 <CODE>DELETE</CODE> 将返回零作为受影响的记录数目。
</P>

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

<PRE>
mysql&#62; DELETE FROM table_name WHERE 1&#62;0;
</PRE>

<P>
注意,这将比一个没有 <CODE>WHERE</CODE> 子句的  <CODE>DELETE FROM table_name</CODE> 语句慢,因为它一次只删除一行。
</P>

<P>
如果你指定关键词 <CODE>LOW_PRIORITY</CODE>,<CODE>DELETE</CODE> 的执行将被延迟,直到没有其它的客户端正在读取表。
</P>

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

<P>
在 <CODE>MyISAM</CODE> 表中,删除了的记录被放在一个链接表中维护,以后的 <CODE>INSERT</CODE> 操作将重新使用删除后的记录位置。为了回收闲置的空间,并减小文件尺寸,使用 <CODE>OPTIMIZE TABLE</CODE> 语句或 <CODE>myisamchk</CODE> 实用程序重新组织表。<CODE>OPTIMIZE TABLE</CODE> 使用比较容易,但是 <CODE>myisamchk</CODE> 更快点。查看章节 <A HREF="manual1.html#OPTIMIZE_TABLE">4.5.1  <CODE>OPTIMIZE TABLE</CODE> 句法</A> 和章节 <A HREF="manual1.html#Optimisation">4.4.6.10  表优化</A>。
</P>

<P>
第一个多表删除格式从 MySQL 4.0.0 开始被支持。第二个多表删除格式从  MySQL 4.0.2 开始被支持。
</P>

<P>
仅仅在 <CODE>FROM</CODE> 或 <CODE>USING</CODE> 子句 <STRONG>之前</STRONG> 列出的表中的匹配记录行被删除。效果就是,你要以从多个表中同时删除记录行,并且同样可以有其它的表用于检索。
</P>
<P>
在表名后的 <CODE>.*</CODE> 仅仅是为了兼容 <CODE>Access</CODE>:

</P>

<PRE>
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id

or

DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
</PRE>

<P>
在上面的情况下,我们仅仅从 <CODE>t1</CODE> 和 <CODE>t2</CODE> 表中删除匹配的记录行。
</P>

<P>
如果一个 <CODE>ORDER BY</CODE> 子句被使用(从 MySQL 4.0.0 开始支持), 记录行将以指定的次序删除。这实际上只有连同 <CODE>LIMIT</CODE> 一起才有用。示例如下:

</P>

<PRE>
DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1
</PRE>

<P>
这将删除匹配 <CODE>WHERE</CODE> 子句的,并且最早被插入(通过 <CODE>timestamp</CODE> 来确定)的记录行。
</P>

<P>
<CODE>DELETE</CODE> 语句的<CODE>LIMIT rows</CODE> 选项是 MySQL 特有的,它告诉服务器在控制权被返回到客户端之前可被删除的最大记录行数目。这可以用来确保一个特定的 <CODE>DELETE</CODE> 命令不会占用太长的时间。你可以简单地重复使用 <CODE>DELETE</CODE> 命令,直到被影响的记录行数目小于 <CODE>LIMIT</CODE> 值。
</P>

<P>
从 MySQL 4.0 开始,在 <CODE>DELETE</CODE> 语句中可以指定多个表,用以从一个表中删除依赖于多表中的特殊情况的记录行。然而,在一个多表删除中,不能使用 <CODE>ORDER BY</CODE> 或 <CODE>LIMIT</CODE>。
</P>



<H3><A NAME="TRUNCATE"></A>6.4.7  <CODE>TRUNCATE</CODE> 句法</H3>

<P>
<A NAME="IDX1440"></A>

</P>

<PRE>
TRUNCATE TABLE table_name
</PRE>

<P>
在 3.23 中,<CODE>TRUNCATE TABLE</CODE> 被映射为 <CODE>COMMIT ; DELETE FROM table_name</CODE>。查看章节 <A HREF="06-4.html#DELETE">6.4.6  <CODE>DELETE</CODE> 句法</A>。
</P>

<P>
在下面的方式中,<CODE>TRUNCATE TABLE</CODE> 不同于 <CODE>DELETE FROM ...</CODE>:
</P>

<UL>
<LI>
删简操作撤销并重建表,这将比一个接一个地删除记录行要快得多。

<LI>
非事务安全的;如果存在一个活动的事务或一个有效的表锁定,你将会得到一个错误。

<LI>
不返回删除了的记录行数目。

<LI>
只要表定义文件 <TT>`table_name.frm'</TT> 是有效的,即使数据或索引文件已经被损坏,也可以通过这种方式重建表。
</UL>

<P>
<CODE>TRUNCATE</CODE> 是一个 Oracle SQL 的扩展。

</P>


<H3><A NAME="REPLACE"></A>6.4.8  <CODE>REPLACE</CODE>句法</H3>

<P>
<A NAME="IDX1441"></A>

</P>

<PRE>
    REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        VALUES (expression,...),(...),...
or  REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
or  REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name
        SET col_name=expression, col_name=expression,...
</PRE>

<P>
<CODE>REPLACE</CODE> 功能与 <CODE>INSERT</CODE> 完全一样,除了如果在表中存在一个老的记录与新记录在一个 <CODE>UNIQUE</CODE> 或 <CODE>PRIMARY KEY</CODE> 上有相同的值,那么在新记录被插入之前,老的记录将被删除。查看章节 <A HREF="06-4.html#INSERT">6.4.3  <CODE>INSERT</CODE> 句法</A>。
</P>

<P>
换句话说,你不可以从一个 <CODE>REPLACE</CODE> 中访问老的记录行的值。某些老的 MySQL 版本中,你或许可以这样做,但是这是一个 Bug,现在已被修正了。
</P>

<P>
为了能够使用 <CODE>REPLACE</CODE>,你必须有对该表的 <CODE>INSERT</CODE> 和 <CODE>DELETE</CODE> 权限。
</P>

<P>
当你使用一个 <CODE>REPLACE</CODE> 时,如果新的记录行代替了老的记录行,<CODE>mysql_affected_rows()</CODE> 将返回 2。这是因为在新行被插入之前,重复记录行被先删除了。
</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -