﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;h2&gt;&lt;font color="green"&gt;生命科学领域的专业信息解决方案！&lt;/font&gt;&lt;/h2&gt;-随笔分类-MySQL</title><link>http://www.blogjava.net/rain1102/category/37647.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;化学结构搜索，化学信息学，生物信息学，实验室信息学等
。&lt;/font&gt;&lt;br/&gt;&lt;font color="#3C1435"&gt;以高科技的生物、化学信息技术实现生命科学领域中专业数据的计算和管理、提高研发能力、增强在科研和成本效率方面的国际竞争力，为生物、化学、医药和学术机构提供一流的解决方案和技术咨询。&lt;/font&gt;&lt;br/&gt;
&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;&lt;br/&gt;
</description><language>zh-cn</language><lastBuildDate>Fri, 01 Jul 2011 01:09:53 GMT</lastBuildDate><pubDate>Fri, 01 Jul 2011 01:09:53 GMT</pubDate><ttl>60</ttl><item><title>存储BitSet到MySQL中--相似度搜索</title><link>http://www.blogjava.net/rain1102/archive/2011/06/29/353331.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 29 Jun 2011 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/06/29/353331.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/353331.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/06/29/353331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/353331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/353331.html</trackback:ping><description><![CDATA[分子结构式相似度搜索使用的是fingerprint进行比较，而<div style="display: inline-block; "></div>fingerprint是一个二进制数据，CDK中使用BitSet来存储该信息，如果要每次比对都去生成BitSet，那也太耗时间了，所以我们需要存储<div style="display: inline-block; "></div>fingerprint信息到数据库中，比较的时候，直接读取，而MySQL不支持存储BitSet数据，网站找了一下，有人想到把<div style="display: inline-block; "></div>BitSet转换成Blob信息进行存储，然后取的时候再转换回来，不愧是个好的方法。下面来看看代码实现：<br /><br /><div><div>/*</div><div>&nbsp;* Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.</div><div>&nbsp;*</div><div>&nbsp;* This software is the confidential and proprietary information of</div><div>&nbsp;* Founder. You shall not disclose such Confidential Information</div><div>&nbsp;* and shall use it only in accordance with the terms of the agreements</div><div>&nbsp;* you entered into with Founder.</div><div>&nbsp;*</div><div>&nbsp;*/</div><div>package com.founder.mysql;</div><div></div><div>import java.sql.Blob;</div><div>import java.sql.Connection;</div><div>import java.sql.SQLException;</div><div>import java.util.BitSet;</div><div></div><div>public class MySQLUtil {</div><div></div><div><span style="white-space:pre">	</span>public static Blob bitsetToBlob(BitSet myBitSet, Connection con) throws SQLException {</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;byte[] byteArray = toByteArray(myBitSet);</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;Blob blob = con.createBlob();</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;blob.setBytes(1, byteArray);</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;return blob;</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>private static byte[] toByteArray(BitSet bits) {</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;byte[] bytes = new byte[bits.length()/8+1];</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;for (int i=0; i&lt;bits.length(); i++) {</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp;if (bits.get(i)) {</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bytes[bytes.length-i/8-1] |= 1&lt;&lt;(i%8);</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp;}</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;}</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;return bytes;</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>public static BitSet blobToBitSet(Blob blob) throws SQLException {</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;byte[] bytes = blob.getBytes(1, (int)blob.length());</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;BitSet bitSet = fromByteArray(bytes);</div><div></div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;return bitSet;</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>private static BitSet fromByteArray(byte[] bytes) {</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;BitSet bits = new BitSet(1024); &nbsp;</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;for (int i=0; i&lt;bytes.length*8; i++) {</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp;if ((bytes[bytes.length-i/8-1]&amp;(1&lt;&lt;(i%8))) &gt; 0) {</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bits.set(i);</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp;}</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;}</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;return bits;</div><div><span style="white-space:pre">	</span>}</div><div>}</div></div><div><br />通过以上代码，我们就可以把fingerprint的值计算出来，然后存储到MySQL数据库中了。<br />进行相似度搜索的时候，值需要取出已经存储的值进行比对就可以了。<br /><div>float coefficient = Tanimoto.calculate(query, MySQLUtil.blobToBitSet(results.getBlob("bits")));<br />笔者测试了187586条结构数据，大概需要12秒左右，基本满足一般需求。</div></div><img src ="http://www.blogjava.net/rain1102/aggbug/353331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-06-29 10:20 <a href="http://www.blogjava.net/rain1102/archive/2011/06/29/353331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何调整MySQL 查询缓冲【转载】</title><link>http://www.blogjava.net/rain1102/archive/2011/06/08/351942.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 08 Jun 2011 13:11:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/06/08/351942.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/351942.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/06/08/351942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/351942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/351942.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 20px; font-family: Arial; color: rgb(68,68,68); font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px" class="Apple-style-span"> 
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span">QueryCache(下面简称QC)是根据SQL语句来cache的。一个SQL查询如果以select开头，那么MySQL服务器将尝试对其使用QC。每个Cache都是以SQL文本作为key来存的。在应用QC之前，SQL文本不会被作任何处理。也就是说，两个SQL语句，只要相差哪怕是一个字 符（例如大小写不一样；多一个空格等），那么这两个SQL将使用不同的一个CACHE。<br style="line-height: normal" /><br style="line-height: normal" />不过SQL文本有可能会被客户端做一些处理。例如在官方的命令行客户端里，在发送SQL给服务器之前，会做如下处理：<span style="line-height: normal" class="Apple-converted-space"><span class="Apple-converted-space">&nbsp;</span></span><br style="line-height: normal" />过滤所有注释,去掉SQL文本前后的空格,TAB等字符。注意，是文本前面和后面的。中间的不会被去掉。<br style="line-height: normal" /><br style="line-height: normal" />下面的三条SQL里，因为SELECT大小写的关系，最后一条和其他两条在QC里肯定是用的不一样的存储位置。而第一条和第二条，区别在于后者有个注释， 在不同客户端，会有不一样的结果。所以，保险起见，请尽量不要使用动态的注释。在PHP的mysql扩展里，SQL的注释是不会被去掉的。也就是三条SQL会被存储在三个不同的缓存里，虽然它们的结果都是一样的。<span style="line-height: normal" class="Apple-converted-space"><span class="Apple-converted-space">&nbsp;</span></span><br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">select * FROM people where name='surfchen';<span style="line-height: normal" class="Apple-converted-space"><span class="Apple-converted-space">&nbsp;</span></span><br style="line-height: normal" />select * FROM people where /*hey~*/name='surfchen';<span style="line-height: normal" class="Apple-converted-space"><span class="Apple-converted-space">&nbsp;</span></span><br style="line-height: normal" />SELECT * FROM people where name='surfchen';</font><span style="line-height: normal" class="Apple-converted-space"><span class="Apple-converted-space">&nbsp;</span></span><br style="line-height: normal" /><br style="line-height: normal" />目前只有select语句会被cache，其他类似show,use的语句则不会被cache。<br style="line-height: normal" /><br style="line-height: normal" />因为QC是如此前端，如此简单的一个缓存系统，所以如果一个表被更新，那么和这个表相关的SQL的所有QC都会被失效。假设一个联合查询里涉及到了表A和表B，如果表A或者表B的其中一个被更新（update或者delete），这个查询的QC将会失效。<br style="line-height: normal" /><br style="line-height: normal" />也就是说，<strong style="line-height: normal">如果一个表被频繁更新，那么就要考虑清楚究竟是否应该对相关的一些SQL进行QC了。</strong>一个被频繁更新的表如果被应用了QC，可能会加重数据库的负担，而不是减轻负担。我一般的做法是默认打开QC，而对一些涉及频繁更新的表的SQL语句加上SQL_NO_CACHE关键词来对其禁用CACHE。这样可以尽可能避免不必要的内存操作，尽可能保持内存的连续性。<br style="line-height: normal" /><br style="line-height: normal" /><strong style="line-height: normal">那些查询很分散的SQL语句，也不应该使用QC。</strong>例如用来查询用户和密码的语句&#8212;&#8212;&#8220;select pass from user where name='surfchen'&#8221;。这样的语句，在一个系统里，很有可能只在一个用户登陆的时候被使用。每个用户的登陆所用到的查询，都是不一样的SQL 文本，QC在这里就几乎不起作用了，因为缓存的数据几乎是不会被用到的，它们只会在内存里占地方。</span></span><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><br style="line-height: normal" /><br style="line-height: normal" /><strong style="line-height: normal">存储块，</strong>在本节里&#8220;存储块&#8221;和&#8220;block&#8221;是同一个意思。<br style="line-height: normal" /><br style="line-height: normal" />QC缓存一个查询结果的时候，一般情况下不是一次性地分配足够多的内存来缓存结果的。而是在查询结果获得的过程中，逐块存储。当一个存储块被填满之后，一个新的存储块将会被创建，并分配内存（allocate）。<strong style="line-height: normal">单个存储块的内存分配大小通过query_cache_min_res_unit参数控制，默认为4KB</strong>。最后一个存储块，如果不能被全部利用，那么没使用的内存将会被释放。如果被缓存的结果很大，那么可能会导致分配内存操作太频繁，系统性能也随之下降；而如果被缓存的结果都很小，那么可能会导致内存碎片过多，这些碎片如果太小，就很有可能不能再被分配使用。<br style="line-height: normal" /><br style="line-height: normal" />除了查询结果需要存储块之外，每个SQL文本也需要一个存储块，而涉及到的表也需要一个存储块（表的存储块是所有线程共享的，每个表只需要一个存储块）。<span class="Apple-converted-space">&nbsp;</span><strong style="line-height: normal">存储块总数量=查询结果数量*2+涉及的数据库表数量</strong>。也就是说，第一个缓存生成的时候，至少需要三个存储块：表信息存储块，SQL文本存储块，查询结果存储块。而第二个查询如果用的是同一个表，那么最少只需要两个存储块：SQL文本存储块，查询结果存储块。<br style="line-height: normal" /><br style="line-height: normal" /><strong style="line-height: normal">通过观察Qcache_queries_in_cache和Qcache_total_blocks可以知道平均每个缓存结果占用的存储块</strong>。它们的比例如果接近1:2，则说明当前的query_cache_min_res_unit参数已经足够大了。如果Qcache_total_blocks比Qcache_queries_in_cache多很多，则需要增加query_cache_min_res_unit的大小。<br style="line-height: normal" /><br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_queries_in_cache * query_cache_min_res_unit（sql文本和表信息所在的block占用的内存很小，可以忽略）如果远远大于query_cache_size - Qcache_free_memory，那么可以尝试减小 query_cache_min_res_unit的值。</font></span></span></p>
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><br style="line-height: normal" /><strong style="line-height: normal">调整大小</strong><br style="line-height: normal" />如果Qcache_lowmem_prunes增长迅速，意味着很多缓存因为内存不够而被释放，而不是因为相关表被更新。尝试加大query_cache_size，尽量使Qcache_lowmem_prunes零增长。<span style="line-height: normal" class="Apple-converted-space"></span></span></span></p>
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><br style="line-height: normal" /><strong style="line-height: normal">启动参数</strong><br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">show variables like 'query_cache%'</font><span class="Apple-converted-space">&nbsp;</span>可以看到这些信息。<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">query_cache_limit:</font><span class="Apple-converted-space">&nbsp;</span>如果单个查询结果大于这个值，则不Cache<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">query_cache_size</font>: 分配给QC的内存。如果设为0，则相当于禁用QC。<strong style="line-height: normal">要注意QC必须使用大约40KB来存储它的结构，如果设定小于 40KB,则相当于禁用QC。</strong>QC存储的最小单位是1024 byte，所以如果你设定了一个不是1024的倍数的值，这个值会被四舍五入到最接近当前值的等于1024的倍数的值。<span style="line-height: normal" class="Apple-converted-space"><span class="Apple-converted-space">&nbsp;</span></span><br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">query_cache_type</font>: 0 完全禁止QC，不受SQL语句控制（另外可能要注意的是，即使这里禁用，上面一个参数所设定的内存大小还是会被分配）；1启用QC，可以在SQL语句使用 SQL_NO_CACHE禁用；2可以在SQL语句使用SQL_CACHE启用。<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">query_cache_min_res_unit</font>: 每次给QC结果分配内存的大小</span></span></p>
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><br style="line-height: normal" /><strong style="line-height: normal">状态</strong><br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">show status like 'Qcache%'</font><span class="Apple-converted-space">&nbsp;</span>可以看到这些信息。<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_free_blocks</font>: 当一个表被更新之后，和它相关的cache blocks将被free。但是这个block依然可能存在队列中，除非是在队列的尾部。这些blocks将会被统计到这个值来。可以用FLUSH QUERY CACHE语句来清空free blocks。<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_free_memory</font>: 可用内存，如果很小，考虑增加query_cache_size<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_hits</font>: 自mysql进程启动起，cache的命中数量<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_inserts</font>: 自mysql进程启动起，被增加进QC的数量<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_lowmem_prunes</font>: 由于内存过少而导致QC被删除的条数。加大query_cache_size，尽可能保持这个值0增长。<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_not_cached</font>: 自mysql进程启动起，没有被cache的只读查询数量（包括select,show,use,desc等）<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_queries_in_cache</font>: 当前被cache的SQL数量<br style="line-height: normal" /><font style="line-height: normal" color="#0000ff">Qcache_total_blocks</font>: 在QC中的blocks数。一个query可能被多个blocks存储，而这几个blocks中的最后一个未用满的内存将会被释放掉。例如一个QC结果要占6KB内存，如果query_cache_min_res_unit是4KB，则最后将会生成3个blocks，第一个block用来存储sql语句文本，这个不会被统计到query_cache_size里，第二个block为4KB，第三个block为2KB（先allocate4KB，然后释放多余的2KB）。每个表，当第一个和它有关的SQL查询被CACHE的时候，会使用一个 block来存储表信息。也就是说，block会被用在三处地方：表信息，SQL文本，查询结果。</span></span></p>
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><font style="line-height: normal" color="#0000ff">show global status like 'Com_select'</font><span class="Apple-converted-space">&nbsp;</span>可以看到未中cache的查询次数，包括读写查询。</span></span></p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span">
<p style="line-height: normal"><span style="line-height: normal">SELECT</span>查询的总数量等价于：</p>
<p style="line-height: normal"><span style="line-height: normal"><font style="line-height: normal" face="Courier New">Com_select<span class="Apple-converted-space">&nbsp;</span></font></span><span style="line-height: normal"><font style="line-height: normal" face="Courier New">+ Qcache_hits<span class="Apple-converted-space">&nbsp;</span></font></span><span style="line-height: normal"><font style="line-height: normal" face="Courier New">+ queries with errors found by parser</font></span></p>
<p style="line-height: normal"><span style="line-height: normal">Com_select</span>的值等价于：</p><pre style="line-height: normal"><span style="line-height: normal"><font style="line-height: normal" face="Courier New">Qcache_inserts </font></span><span style="line-height: normal"><font style="line-height: normal" face="Courier New">+ Qcache_not_cached </font></span><span style="line-height: normal"><font style="line-height: normal" face="Courier New">+ queries with errors found during columns/rights check</font></span></pre></span></span>
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><strong style="line-height: normal"><font style="line-height: normal" color="#000000">常用计算公式：</font></strong></span></span></p>
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><font style="line-height: normal" color="#0000ff">Qcache命中率：Qcache_hits / (Com_select + Qcache_hits)</font></span></span></p>
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><font style="line-height: normal" color="#0000ff">Qcache碎片率：Qcache_free_blocks / Qcache_total_blocks</font></span></span></p>
<p style="line-height: normal"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span style="line-height: 20px; color: rgb(68,68,68); font-size: 14px" class="Apple-style-span"><font style="line-height: normal" color="#0000ff">Query结果集平均大小：(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache</font></span></span></p></span></span><img src ="http://www.blogjava.net/rain1102/aggbug/351942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-06-08 21:11 <a href="http://www.blogjava.net/rain1102/archive/2011/06/08/351942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 百万数据存储过程 查询优化技巧【转载】</title><link>http://www.blogjava.net/rain1102/archive/2011/05/20/350711.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 20 May 2011 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/05/20/350711.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/350711.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/05/20/350711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/350711.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/350711.html</trackback:ping><description><![CDATA[1.对查询进行优化，应尽量避免全表扫描，首先应考虑在 where 及 order by 涉及的列上建立索引。<br />2.应尽量避免在 where 子句中对字段进行 null 值判断，否则将导致引擎放弃使用索引而进行全表扫描，如：<br />select id from t where num is null<br />可以在num上设置默认值0，确保表中num列没有null值，然后这样查询：<br />select id from t where num=0<br />3.应尽量避免在 where 子句中使用!=或&lt;&gt;操作符，否则将引擎放弃使用索引而进行全表扫描。<br />4.应尽量避免在 where 子句中使用 or 来连接条件，否则将导致引擎放弃使用索引而进行全表扫描，如：<br />select id from t where num=10 or num=20<br />可以这样查询：<br />select id from t where num=10<br />union all<br />select id from t where num=20<br />5.in 和 not in 也要慎用，否则会导致全表扫描，如：<br />select id from t where num in(1,2,3)<br />对于连续的数值，能用 between 就不要用 in 了：<br />select id from t where num between 1 and 3<br />6.下面的查询也将导致全表扫描：<br />select id from t where name like &#8216;%abc%&#8217;<br />若要提高效率，可以考虑全文检索。<br />7.如果在 where<br />子句中使用参数，也会导致全表扫描。因为SQL只有在运行时才会解析局部变量，但优化程序不能将访问计划的选择推迟到运行时；它必须在编译时进行选择。然而，如果在编译时建立访问计划，变量的值还是未知的，因而无法作为索引选择的输入项。如下面语句将进行全表扫描：<br />select id from t where num=@num &lt;mailto:num=@num&gt;<br />可以改为强制查询使用索引：<br />select id from t with(index(索引名)) where num=@num &lt;mailto:num=@num&gt;<br />8.应尽量避免在 where 子句中对字段进行表达式操作，这将导致引擎放弃使用索引而进行全表扫描。如：<br />select id from t where num/2=100<br />应改为:<br />select id from t where num=100*2<br />9.应尽量避免在where子句中对字段进行函数操作，这将导致引擎放弃使用索引而进行全表扫描。如：<br />select id from t where substring(name,1,3)=&#8217;abc&#8217;&#8211;name以abc开头的id<br />select id from t where<br />datediff(day,createdate,&#8217;2005-11-30&#8242;)=0&#8211;&#8216;2005-11-30&#8217;生成的id<br />应改为:<br />select id from t where name like &#8216;abc%&#8217;<br />select id from t where createdate&gt;=&#8217;2005-11-30&#8242; and createdate&lt;&#8217;2005-12-1&#8242;<br />10.不要在 where 子句中的&#8220;=&#8221;左边进行函数、算术运算或其他表达式运算，否则系统将可能无法正确使用索引。<br />11.在使用索引字段作为条件时，如果该索引是复合索引，那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引，否则该索引将不会被使用，并且应尽可能的让字段顺序与索引顺序相一致。<br />12.不要写一些没有意义的查询，如需要生成一个空表结构：<br />select col1,col2 into #t from t where 1=0<br />这类代码不会返回任何结果集，但是会消耗系统资源的，应改成这样：<br />create table #t(&#8230;)<br />13.很多时候用 exists 代替 in 是一个好的选择：<br />select num from a where num in(select num from b)<br />用下面的语句替换：<br />select num from a where exists(select 1 from b where num=a.num)<br />14.并不是所有索引对查询都有效，SQL是根据表中数据来进行查询优化的，当索引列有大量数据重复时，SQL查询可能不会去利用索引，如一表中有字段sex，male、female几乎各一半，那么即使在sex上建了索引也对查询效率起不了作用。<br />15.索引并不是越多越好，索引固然可以提高相应的 select 的效率，但同时也降低了 insert 及 update 的效率，因为 insert 或<br />update<br />时有可能会重建索引，所以怎样建索引需要慎重考虑，视具体情况而定。一个表的索引数最好不要超过6个，若太多则应考虑一些不常使用到的列上建的索引是否有必要。<br />16.应尽可能的避免更新 clustered 索引数据列，因为 clustered<br />索引数据列的顺序就是表记录的物理存储顺序，一旦该列值改变将导致整个表记录的顺序的调整，会耗费相当大的资源。若应用系统需要频繁更新 clustered<br />索引数据列，那么需要考虑是否应将该索引建为 clustered 索引。<br />17.尽量使用数字型字段，若只含数值信息的字段尽量不要设计为字符型，这会降低查询和连接的性能，并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符，而对于数字型而言只需要比较一次就够了。<br />18.尽可能的使用 varchar/nvarchar 代替 char/nchar<br />，因为首先变长字段存储空间小，可以节省存储空间，其次对于查询来说，在一个相对较小的字段内搜索效率显然要高些。<br />19.任何地方都不要使用 select * from t ，用具体的字段列表代替&#8220;*&#8221;，不要返回用不到的任何字段。<br />20.尽量使用表变量来代替临时表。如果表变量包含大量数据，请注意索引非常有限（只有主键索引）。<br />21.避免频繁创建和删除临时表，以减少系统表资源的消耗。<br />22.临时表并不是不可使用，适当地使用它们可以使某些例程更有效，例如，当需要重复引用大型表或常用表中的某个数据集时。但是，对于一次性事件，最好使用导出表。<br />23.在新建临时表时，如果一次性插入数据量很大，那么可以使用 select into 代替 create table，避免造成大量 log<br />，以提高速度；如果数据量不大，为了缓和系统表的资源，应先create table，然后insert。<br />24.如果使用到了临时表，在存储过程的最后务必将所有的临时表显式删除，先 truncate table ，然后 drop table<br />，这样可以避免系统表的较长时间锁定。<br />25.尽量避免使用游标，因为游标的效率较差，如果游标操作的数据超过1万行，那么就应该考虑改写。<br />26.使用基于游标的方法或临时表方法之前，应先寻找基于集的解决方案来解决问题，基于集的方法通常更有效。<br />27.与临时表一样，游标并不是不可使用。对小型数据集使用 FAST_FORWARD<br />游标通常要优于其他逐行处理方法，尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括&#8220;合计&#8221;的例程通常要比使用游标执行的速度快。如果开发时间允许，基于游标的方法和基于集的方法都可以尝试一下，看哪一种方法的效果更好。<br />28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ，在结束时设置 SET NOCOUNT OFF<br />。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。<br />29.尽量避免大事务操作，提高系统并发能力。<br />30.尽量避免向客户端返回大数据量，若数据量过大，应该考虑相应需求是否合理。<img src ="http://www.blogjava.net/rain1102/aggbug/350711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-05-20 22:00 <a href="http://www.blogjava.net/rain1102/archive/2011/05/20/350711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL存储过程中的3种循环【转载】</title><link>http://www.blogjava.net/rain1102/archive/2011/05/16/350301.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 16 May 2011 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/05/16/350301.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/350301.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/05/16/350301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/350301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/350301.html</trackback:ping><description><![CDATA[<div>
<p>在MySQL存储过程的语句中有三个标准的循环方式：WHILE循环，LOOP循环以及REPEAT循环。还有一种非标准的循环方式：GOTO，不过这种循环方式最好别用，很容易引起程序的混乱，在这里就不错具体介绍了。</p>
<p>这几个循环语句的格式如下：<br />
WHILE&#8230;&#8230;DO&#8230;&#8230;END WHILE<br />
REPEAT&#8230;&#8230;UNTIL END REPEAT<br />
LOOP&#8230;&#8230;END LOOP<br />
GOTO。</p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 下面首先使用第一种循环编写一个例子。<br />
mysql&gt; create procedure pro10()<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; begin<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; declare i int;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; set i=0;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; while i&lt;5 do<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> insert into t1(filed) values(i);<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> set i=i+1;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end while;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end;//<br />
Query OK, 0 rows affected (0.00 sec)<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 在这个例子中，INSERT和SET语句在WHILE和END WHILE之间，当变量i大于等于5的时候就退出循环。使用set i=0；语句是为了防止一个常见的错误，如果没有初始化，i默认变量值为NULL，而NULL和任何值操作的结果都是NULL。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 执行一下这个存储过程并产看一下执行结果：<br />
mysql&gt; delete from t1//<br />
Query OK, 0 rows affected (0.00 sec)<br />
mysql&gt; call pro10()//<br />
Query OK, 1 row affected (0.00 sec)<br />
mysql&gt; select * from t1//<br />
+——-+<br />
| filed |<br />
+——-+<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4 |<br />
+——-+<br />
5 rows in set (0.00 sec)<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 以上就是执行结果，有5行数据插入到数据库中，证明存储过程编写正确无误^_^。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 再来看一下第二个循环控制指令 REPEAT&#8230;&#8230;END REPEAT。使用REPEAT循环控制语句编写下面这个存储过程：<br />
mysql&gt; create procedure pro11()<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; begin<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; declare i int default 0;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; repeat<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> insert into t1(filed) values(i);<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> set i=i+1;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> until i&gt;=5<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end repeat;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end;//<br />
Query OK, 0 rows affected (0.00 sec)<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 这个REPEAT循环的功能和前面WHILE循环一样，区别在于它的执行后检查是否满足循环条件（until i&gt;=5），而WHILE则是执行前检查（while i&lt;5 do）。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 不过要注意until i&gt;=5后面不要加分号，如果加分号，就是提示语法错误。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 编写完成后，调用一下这个存储过程，并查看结果：<br />
mysql&gt; delete from t1//<br />
Query OK, 5 rows affected (0.00 sec)</p>
<p>mysql&gt; call pro11()//<br />
Query OK, 1 row affected (0.00 sec) #虽然在这里显示只有一行数据受到影响，但是下面选择数据的话，还是插入了5行数据。</p>
<p>mysql&gt; select * from t1//<br />
+——-+<br />
| filed |<br />
+——-+<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4 |<br />
+——-+<br />
5 rows in set (0.00 sec)<br />
一行就是执行结果，实际的作用和使用while编写的存储过程一样，都是插入5行数据。</p>
<div>
<p>再来看一下第三个循环控制语句LOOP&#8230;&#8230;END LOOP。编写一个存储过程程序如下：<br />
mysql&gt; create procedure pro12()<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; begin<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; declare i int default 0;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; loop_label: loop<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> insert into t1(filed) values(i);<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> set i=i+1;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if i&gt;=5 then<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> leave loop_label;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> end if;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end loop;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end;//<br />
Query OK, 0 rows affected (0.00 sec)<br />
从上面这个例子可以看出，使用LOOP编写同样的循环控制语句要比使用while和repeat编写的要复杂一些：在循环内部加入了IF&#8230;&#8230;END IF语句，在IF语句中又加入了LEAVE语句，LEAVE语句的意思是离开循环，LEAVE的格式是：LEAVE 循环标号。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 编写完存储过程程序后，来执行并查看一下运行结果：<br />
mysql&gt; delete from t1//<br />
Query OK, 5 rows affected (0.00 sec) </p>
<p>&nbsp;<wbr></p>
<p>mysql&gt; call pro12//<br />
Query OK, 1 row affected (0.00 sec) #虽然说只有一行数据受影响，但是实际上是插入了5行数据。</p>
<p>mysql&gt; select * from t1//<br />
+——-+<br />
| filed |<br />
+——-+<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4 |<br />
+——-+<br />
5 rows in set (0.00 sec)<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 执行结果和使用WHILE、LOOP编写的循环一样，都是往标中插入5行值。</p>
<p>&nbsp;<wbr>&nbsp;<wbr> Labels&nbsp;<wbr>&nbsp;<wbr> 标号和 END Labels 结束标号<br />
&nbsp;<wbr>&nbsp;<wbr> 在使用loop的时候，使用到的labels标号，对于labels可以用到while，loop，rrepeat等循环控制语句中。而且有必要好好认识一下lables!！<br />
mysql&gt; create procedure pro13()<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; label_1:begin<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; label_2:while 0=1 do leave label_2;end while;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; label_3:repeat leave label_3;until 0=0 end repeat;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; label_4:loop leave label_4;end loop;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end;//<br />
Query OK, 0 rows affected (0.00 sec)<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 上面这里例子显示了可以在BEGIN、WHILE、REPEAT或者LOOP语句前使用语句标号，语句标号只能在合法的语句前使用，所以LEAVE label_3意味着离开语句标号名为label_3的语句或符合语句。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 其实，也可以使用END labels来表示标号结束符。<br />
mysql&gt; create procedure pro14()<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; label_1:begin<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; label_2:while 0=1 do leave label_2;end while label_2;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; label_3:repeat leave label_3;until 0=0 end repeat label_3;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; label_4:loop leave label_4;end loop label_4;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end label_1;//<br />
Query OK, 0 rows affected (0.00 sec)<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 上面就是使用了标号结束符，其实这个结束标号并不是十分有用，而且他必须和开始定义的标号名字一样，否则就会报错。如果要养成一个良好的编程习惯方便他人阅读的话，可以使用这个标号结束符。</p>
<p>ITERATE 迭代&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果是在ITERATE语句，即迭代语句中的话，就必须使用LEAVE语句。ITERATE只能出现在LOOP，REPEAT和WHILE语句中，它的意思是&#8220;再次循环&#8221;，例如：<br />
mysql&gt; create procedure pro15()&nbsp;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; begin<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; declare i int default 0;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; loop_label:loop<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if i=3 then<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> set i=i+1;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> iterate loop_label;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> end if;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> insert into t1(filed) values(i);<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> set i=i+1;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if i&gt;=5 then<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> leave loop_label;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> end if;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt;&nbsp;<wbr>&nbsp;<wbr> end loop;<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -&gt; end;//<br />
Query OK, 0 rows affected (0.00 sec)<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> iterate语句和leave语句一样，也是在循环内部使用，它有点类似于C/C++语言中的continue。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 那么这个存储程序是怎么运行的的？首先i的值为0，条件判断语句if i=3 then判断为假，跳过if语段，向数据库中插入0，然后i+1，同样后面的if i&gt;=5 then判断也为假，也跳过；继续循环，同样插入1和2；在i=3的时候条件判断语句if i=3 then判断为真，执行i=i+1，i值为4，然后执行迭代iterate loop_label;，即语句执行到iterate loop_label;后直接跳到if i=3 then判断语句，执行判断，这个时候由于i=4，if i=3 then判断为假，跳过IF语段，将4添加到表中，i变为5，条件判断if i&gt;=5 then判断为真，执行leave loop_label;跳出loop循环，然后执行end;//，结束整个存储过程。<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 综上所述，数据库中将插入数值：0,1,2,4。执行存储过程，并查看结果：|<br />
mysql&gt; delete from t1//<br />
Query OK, 5 rows affected (0.00 sec) </p>
<p>&nbsp;<wbr></p>
<p>mysql&gt; call pro15//<br />
Query OK, 1 row affected (0.00 sec)</p>
<p>mysql&gt; select * from t1//<br />
+——-+<br />
| filed |<br />
+——-+<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2 |<br />
|&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4 |<br />
+——-+<br />
4 rows in set (0.00 sec)</p>
<p>和我们上面分析的结果一样，只插入了数值0,1,2,4。</p>
</div>
</div><img src ="http://www.blogjava.net/rain1102/aggbug/350301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-05-16 10:41 <a href="http://www.blogjava.net/rain1102/archive/2011/05/16/350301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ERROR 1126 (HY000): Can't Open Shared Library(install UDF to mysql 5.1 in ubuntu 9.10)</title><link>http://www.blogjava.net/rain1102/archive/2010/05/10/320485.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 10 May 2010 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/05/10/320485.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/320485.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/05/10/320485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/320485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/320485.html</trackback:ping><description><![CDATA[I try to install mychem3.0.6 into mysql5.1 in ubuntun 9.10 enviroment, and all things have been built, just in the last step i encounter an error about can't open shared library when i import sql to mysql(udf). I search the solution by google, that's great i found it and it works well now.
<div>it caused by ubuntu apparmor, so you just need to disable it.</div>
<div><span style="font-size: 14px; line-height: 15px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; border-collapse: collapse">touch /etc/apparmor.d/disable/usr.sbin.mysqld</span></div>
<div><span style="font-size: 14px; line-height: 15px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; border-collapse: collapse">/etc/init.d/apparmor restart</span></div>
<div><span style="font-size: 14px; line-height: 15px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; border-collapse: collapse">/etc/init.d/mysql restart</span></div>
<div><span style="font-size: 14px; line-height: 15px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; border-collapse: collapse">all above commands need root account.</span></div><img src ="http://www.blogjava.net/rain1102/aggbug/320485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-05-10 16:09 <a href="http://www.blogjava.net/rain1102/archive/2010/05/10/320485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Ubuntu下使MySQL数据库可以被远程访问</title><link>http://www.blogjava.net/rain1102/archive/2010/04/09/317857.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 09 Apr 2010 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/04/09/317857.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/317857.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/04/09/317857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/317857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/317857.html</trackback:ping><description><![CDATA[<p>在Ubuntu下MySQL缺省是只允许本地访问的，如果你要其他机器也能远程够访问这台Mysql数据库的话，需要设置一些东西，下面我们一步步地来：</p>
<p>一、配置文件的修改<br />
&nbsp;&nbsp;&nbsp; 1.#sudo vim /etc/mysql/my.cnf</p>
<p>&nbsp;&nbsp;&nbsp; 找到 bind-address = 127.0.0.1<br />
&nbsp;&nbsp;&nbsp; 注释掉这句话 <br />
&nbsp;<br />
二、Mysql数据库的修改<br />
1) [root@etc etc]# mysql -u&nbsp; root&nbsp; -p<br />
Enter password: <br />
2)mysql&gt; use mysql;<br />
3)mysql&gt; select host,user,password from user;<br />
4)grant all privileges on *.* to&nbsp; root@192.168.15.101&nbsp; identified by 'password'<br />
&nbsp;注意： （1）192.168.15.101是欲连接到此Mysql数据库的客户端的IP地址，而不是Mysql数据库所在数据库服务器的IP地址，切记。这里也可以使用'%'代替所有ip<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）password就是Mysql数据库root用户的password,根据实际情况需要修改 </p>
<p>三、再次用Mysql客户端登陆</p>
<p>&nbsp;</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/bjblues/archive/2008/02/04/2083934.aspx</p><img src ="http://www.blogjava.net/rain1102/aggbug/317857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-04-09 15:49 <a href="http://www.blogjava.net/rain1102/archive/2010/04/09/317857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>intersect in mysql</title><link>http://www.blogjava.net/rain1102/archive/2010/03/14/315404.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sun, 14 Mar 2010 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/03/14/315404.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/315404.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/03/14/315404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/315404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/315404.html</trackback:ping><description><![CDATA[<p>An <span style="color: red">INTERSECT </span>is simply an inner join where we compare the tuples of one table with those of the other, and select those that appear in both while weeding out duplicates. So</p>
<p><code><font face="新宋体"><font style="color: #008000" color="#666633">select id, username from user where id&gt;1<br />
INTERSECT<br />
select id, username from user where id&lt;3</font></font></code></p>
<p>can simply be rewritten to</p>
<p><code><font face="新宋体"><font style="color: #ff0000" color="#0000ff"><strong>select id, username from user inner join<br />
(select id, username from user where id &lt;3) as b using (id, username)<br />
where id&gt;1</strong></font></font></code></p>
or<br />
<span style="color: red"><strong>select a.id, a.username from<br />
((select id, username from user where id &gt; 1) as a<br />
cross join <br />
(select id, username from user where id &lt;3) as b&nbsp; on a.id = b.id)</strong></span><img src ="http://www.blogjava.net/rain1102/aggbug/315404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-03-14 20:49 <a href="http://www.blogjava.net/rain1102/archive/2010/03/14/315404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL序列解决方案[转载]</title><link>http://www.blogjava.net/rain1102/archive/2010/03/09/314917.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 09 Mar 2010 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/03/09/314917.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/314917.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/03/09/314917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/314917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/314917.html</trackback:ping><description><![CDATA[<span class="hilite1"><span class="hilite1">原文地址: http://meetrice.javaeye.com/blog/89426<br />
<br />
MySQL</span>自增长与Oracle序列的区别: <br />
自增长只能用于表中的其中一个字段 <br />
自增长只能被分配给固定表的固定的某一字段，不能被多个表共用. <br />
自增长会把一个未指定或NULL值的字段自动填上. <br />
<br />
在<span class="hilite1">mysql</span>中添加序列，请看下面的实例： <br />
在<span class="hilite1">MYSQL</span>里有这样一张表: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>CREATE&nbsp;TABLE&nbsp;Movie( &nbsp;&nbsp;</span></span>
    <li><span>id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;NOT&nbsp;NULL&nbsp;AUTO_INCREMENT, &nbsp;&nbsp;</span>
    <li><span>name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR(</span><span class="number">60</span><span>)&nbsp;NOT&nbsp;NULL, &nbsp;&nbsp;</span></span>
    <li><span>released&nbsp;YEAR&nbsp;NOT&nbsp;NULL, &nbsp;&nbsp;</span>
    <li><span>PRIMARY&nbsp;KEY&nbsp;(id) &nbsp;&nbsp;</span>
    <li><span>)&nbsp;ENGINE=InnoDB;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">CREATE TABLE Movie(
id           INT NOT NULL AUTO_INCREMENT,
name     VARCHAR(60) NOT NULL,
released YEAR NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
</pre>
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>INSERT&nbsp;INTO&nbsp;Movie&nbsp;(name,released)&nbsp;VALUES&nbsp;(</span><span class="string">'Gladiator'</span><span>,</span><span class="number">2000</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>INSERT&nbsp;INTO&nbsp;Movie&nbsp;(id,name,released)&nbsp;VALUES&nbsp;(NULL,</span><span class="string">'The&nbsp;Bourne&nbsp;Identity'</span><span>,</span><span class="number">1998</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">INSERT INTO Movie (name,released) VALUES ('Gladiator',2000);
INSERT INTO Movie (id,name,released) VALUES (NULL,'The Bourne Identity',1998);
</pre>
<br />
在ORACLE是这样的: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>CREATE&nbsp;TABLE&nbsp;Movie( &nbsp;&nbsp;</span></span>
    <li><span>id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;NOT&nbsp;NULL, &nbsp;&nbsp;</span>
    <li><span>name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(</span><span class="number">60</span><span>)&nbsp;NOT&nbsp;NULL, &nbsp;&nbsp;</span></span>
    <li><span>released&nbsp;INT&nbsp;NOT&nbsp;NULL, &nbsp;&nbsp;</span>
    <li><span>PRIMARY&nbsp;KEY&nbsp;(id) &nbsp;&nbsp;</span>
    <li><span>); &nbsp;&nbsp;</span>
    <li><span>CREATE&nbsp;SEQUENCE&nbsp;MovieSeq;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">CREATE TABLE Movie(
id          INT NOT NULL,
name     VARCHAR2(60) NOT NULL,
released INT NOT NULL,
PRIMARY KEY (id)
);
CREATE SEQUENCE MovieSeq;
</pre>
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>INSERT&nbsp;INTO&nbsp;Movie&nbsp;(id,name,released)&nbsp;VALUES&nbsp;(MovieSeq.NEXTVAL,</span><span class="string">'Gladiator'</span><span>,</span><span class="number">2000</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);
</pre>
<br />
<br />
在oracle下为表添加一个触发器，就可以实现<span class="hilite1">mysql</span>自增长功能: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>CREATE&nbsp;OR&nbsp;REPLACE&nbsp;TRIGGER&nbsp;BRI_MOVIE_TRG &nbsp;&nbsp;</span></span>
    <li><span>BEFORE&nbsp;INSERT&nbsp;ON&nbsp;Movie &nbsp;&nbsp;</span>
    <li><span>FOR&nbsp;EACH&nbsp;ROW &nbsp;&nbsp;</span>
    <li><span>BEGIN &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;SELECT&nbsp;MovieSeq.NEXTVAL&nbsp;INTO&nbsp;:</span><span class="keyword">new</span><span>.id&nbsp;FROM&nbsp;DUAL; &nbsp;&nbsp;</span></span>
    <li><span>END&nbsp;BRI_MOVIE_TRG; &nbsp;&nbsp;</span>
    <li><span>. &nbsp;&nbsp;</span>
    <li><span>RUN;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">CREATE OR REPLACE TRIGGER BRI_MOVIE_TRG
BEFORE INSERT ON Movie
FOR EACH ROW
BEGIN
SELECT MovieSeq.NEXTVAL INTO :new.id FROM DUAL;
END BRI_MOVIE_TRG;
.
RUN;
</pre>
<br />
这样，插件记录就可以成为<span class="hilite1">MYSQL</span>风格： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>INSERT&nbsp;INTO&nbsp;Movie&nbsp;(name,released)&nbsp;VALUES&nbsp;(</span><span class="string">'The&nbsp;Lion&nbsp;King'</span><span>,</span><span class="number">1994</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">INSERT INTO Movie (name,released) VALUES ('The Lion King',1994);
</pre>
<br />
<br />
下面我们来看看如何在<span class="hilite1">mysql</span>数据里使用Oracle序列语法.NEXTVAL 和 .CURVAL. <br />
我们假设在<span class="hilite1">mysql</span>中序列的语法是: <br />
<ul><br />
    NEXTVAL(&#8217;sequence&#8217;); <br />
    CURRVAL(&#8217;sequence&#8217;); <br />
    SETVAL(&#8217;sequence&#8217;,value); <br />
</ul>
<br />
<br />
下面就是<strong><span style="font-size: 24pt">CURRRVAL</span></strong>的实现方案: <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;sequence; &nbsp;&nbsp;</span></span>
    <li><span>CREATE&nbsp;TABLE&nbsp;sequence&nbsp;( &nbsp;&nbsp;</span>
    <li><span>name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR(</span><span class="number">50</span><span>)&nbsp;NOT&nbsp;NULL, &nbsp;&nbsp;</span></span>
    <li><span>current_value&nbsp;INT&nbsp;NOT&nbsp;NULL, &nbsp;&nbsp;</span>
    <li><span>increment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;NOT&nbsp;NULL&nbsp;DEFAULT&nbsp;</span><span class="number">1</span><span>, &nbsp;&nbsp;</span></span>
    <li><span>PRIMARY&nbsp;KEY&nbsp;(name) &nbsp;&nbsp;</span>
    <li><span>)&nbsp;ENGINE=InnoDB; &nbsp;&nbsp;</span>
    <li><span>INSERT&nbsp;INTO&nbsp;sequence&nbsp;VALUES&nbsp;(</span><span class="string">'MovieSeq'</span><span>,</span><span class="number">3</span><span>,</span><span class="number">5</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>DROP&nbsp;FUNCTION&nbsp;IF&nbsp;EXISTS&nbsp;currval; &nbsp;&nbsp;</span>
    <li><span>DELIMITER&nbsp;$ &nbsp;&nbsp;</span>
    <li><span>CREATE&nbsp;FUNCTION&nbsp;currval&nbsp;(seq_name&nbsp;VARCHAR(</span><span class="number">50</span><span>)) &nbsp;&nbsp;</span></span>
    <li><span>RETURNS&nbsp;INTEGER &nbsp;&nbsp;</span>
    <li><span>CONTAINS&nbsp;SQL &nbsp;&nbsp;</span>
    <li><span>BEGIN &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;DECLARE&nbsp;value&nbsp;INTEGER; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;SET&nbsp;value&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;SELECT&nbsp;current_value&nbsp;INTO&nbsp;value &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;FROM&nbsp;sequence &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;seq_name; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;RETURN&nbsp;value; &nbsp;&nbsp;</span>
    <li><span>END$ &nbsp;&nbsp;</span>
    <li><span>DELIMITER&nbsp;;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
name              VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment       INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;
INSERT INTO sequence VALUES ('MovieSeq',3,5);
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END$
DELIMITER ;
</pre>
<br />
测试一下结果： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span><span class="hilite1">mysql</span>&gt;&nbsp;SELECT&nbsp;currval(</span><span class="string">'MovieSeq'</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;currval(</span><span class="string">'MovieSeq'</span><span>)&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">3</span><span>&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set&nbsp;(</span><span class="number">0.00</span><span>&nbsp;sec) &nbsp;&nbsp;</span></span>
    <li><span><span class="hilite1">mysql</span>&gt;&nbsp;SELECT&nbsp;currval(</span><span class="string">'x'</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>+--------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;currval(</span><span class="string">'x'</span><span>)&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+--------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">0</span><span>&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+--------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set,&nbsp;</span><span class="number">1</span><span>&nbsp;warning&nbsp;(</span><span class="number">0.00</span><span>&nbsp;sec) &nbsp;&nbsp;</span></span>
    <li><span><span class="hilite1">mysql</span>&gt;&nbsp;show&nbsp;warnings; &nbsp;&nbsp;</span>
    <li><span>+---------+------+------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;Level&nbsp;&nbsp;&nbsp;|&nbsp;Code&nbsp;|&nbsp;Message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &nbsp;&nbsp;</span>
    <li><span>+---------+------+------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;Warning&nbsp;|&nbsp;</span><span class="number">1329</span><span>&nbsp;|&nbsp;No&nbsp;data&nbsp;to&nbsp;FETCH&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------+------+------------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set&nbsp;(</span><span class="number">0.00</span><span>&nbsp;sec)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code"><span class="hilite1">mysql</span>&gt; SELECT currval('MovieSeq');
+---------------------+
| currval('MovieSeq') |
+---------------------+
|                   3 |
+---------------------+
1 row in set (0.00 sec)
<span class="hilite1">mysql</span>&gt; SELECT currval('x');
+--------------+
| currval('x') |
+--------------+
|            0 |
+--------------+
1 row in set, 1 warning (0.00 sec)
<span class="hilite1">mysql</span>&gt; show warnings;
+---------+------+------------------+
| Level   | Code | Message          |
+---------+------+------------------+
| Warning | 1329 | No data to FETCH |
+---------+------+------------------+
1 row in set (0.00 sec)
</pre>
<br />
<br />
<strong><span style="font-size: 24pt">nextval</span></strong> <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>DROP&nbsp;FUNCTION&nbsp;IF&nbsp;EXISTS&nbsp;nextval; &nbsp;&nbsp;</span></span>
    <li><span>DELIMITER&nbsp;$ &nbsp;&nbsp;</span>
    <li><span>CREATE&nbsp;FUNCTION&nbsp;nextval&nbsp;(seq_name&nbsp;VARCHAR(</span><span class="number">50</span><span>)) &nbsp;&nbsp;</span></span>
    <li><span>RETURNS&nbsp;INTEGER &nbsp;&nbsp;</span>
    <li><span>CONTAINS&nbsp;SQL &nbsp;&nbsp;</span>
    <li><span>BEGIN &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;UPDATE&nbsp;sequence &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;SET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_value&nbsp;=&nbsp;current_value&nbsp;+&nbsp;increment &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;seq_name; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;RETURN&nbsp;currval(seq_name); &nbsp;&nbsp;</span>
    <li><span>END$ &nbsp;&nbsp;</span>
    <li><span>DELIMITER&nbsp;;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE sequence
SET          current_value = current_value + increment
WHERE name = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ;</pre>
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span><span class="hilite1">mysql</span>&gt;&nbsp;select&nbsp;nextval(</span><span class="string">'MovieSeq'</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;nextval(</span><span class="string">'MovieSeq'</span><span>)&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">15</span><span>&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set&nbsp;(</span><span class="number">0.09</span><span>&nbsp;sec) &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span><span class="hilite1">mysql</span>&gt;&nbsp;select&nbsp;nextval(</span><span class="string">'MovieSeq'</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;nextval(</span><span class="string">'MovieSeq'</span><span>)&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">20</span><span>&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set&nbsp;(</span><span class="number">0.01</span><span>&nbsp;sec) &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span><span class="hilite1">mysql</span>&gt;&nbsp;select&nbsp;nextval(</span><span class="string">'MovieSeq'</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;nextval(</span><span class="string">'MovieSeq'</span><span>)&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">25</span><span>&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set&nbsp;(</span><span class="number">0.00</span><span>&nbsp;sec)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code"><span class="hilite1">mysql</span>&gt; select nextval('MovieSeq');
+---------------------+
| nextval('MovieSeq') |
+---------------------+
|                  15 |
+---------------------+
1 row in set (0.09 sec)
<span class="hilite1">mysql</span>&gt; select nextval('MovieSeq');
+---------------------+
| nextval('MovieSeq') |
+---------------------+
|                  20 |
+---------------------+
1 row in set (0.01 sec)
<span class="hilite1">mysql</span>&gt; select nextval('MovieSeq');
+---------------------+
| nextval('MovieSeq') |
+---------------------+
|                  25 |
+---------------------+
1 row in set (0.00 sec)</pre>
<br />
<br />
<strong><span style="font-size: 24pt">setval</span></strong> <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>DROP&nbsp;FUNCTION&nbsp;IF&nbsp;EXISTS&nbsp;setval; &nbsp;&nbsp;</span></span>
    <li><span>DELIMITER&nbsp;$ &nbsp;&nbsp;</span>
    <li><span>CREATE&nbsp;FUNCTION&nbsp;setval&nbsp;(seq_name&nbsp;VARCHAR(</span><span class="number">50</span><span>),&nbsp;value&nbsp;INTEGER) &nbsp;&nbsp;</span></span>
    <li><span>RETURNS&nbsp;INTEGER &nbsp;&nbsp;</span>
    <li><span>CONTAINS&nbsp;SQL &nbsp;&nbsp;</span>
    <li><span>BEGIN &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;UPDATE&nbsp;sequence &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;SET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_value&nbsp;=&nbsp;value &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;seq_name; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;RETURN&nbsp;currval(seq_name); &nbsp;&nbsp;</span>
    <li><span>END$ &nbsp;&nbsp;</span>
    <li><span>DELIMITER&nbsp;;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE sequence
SET          current_value = value
WHERE name = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ;</pre>
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://meetrice.javaeye.com/blog/89426#"><img alt="复制代码" src="http://meetrice.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span><span class="hilite1">mysql</span>&gt;&nbsp;select&nbsp;setval(</span><span class="string">'MovieSeq'</span><span>,</span><span class="number">150</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>+------------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;setval(</span><span class="string">'MovieSeq'</span><span>,</span><span class="number">150</span><span>)&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+------------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">150</span><span>&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+------------------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set&nbsp;(</span><span class="number">0.06</span><span>&nbsp;sec) &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span><span class="hilite1">mysql</span>&gt;&nbsp;select&nbsp;curval(</span><span class="string">'MovieSeq'</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;currval(</span><span class="string">'MovieSeq'</span><span>)&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">150</span><span>&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set&nbsp;(</span><span class="number">0.00</span><span>&nbsp;sec) &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span><span class="hilite1">mysql</span>&gt;&nbsp;select&nbsp;nextval(</span><span class="string">'MovieSeq'</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;nextval(</span><span class="string">'MovieSeq'</span><span>)&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">155</span><span>&nbsp;| &nbsp;&nbsp;</span></span>
    <li><span>+---------------------+ &nbsp;&nbsp;</span>
    <li><span class="number">1</span><span>&nbsp;row&nbsp;in&nbsp;set&nbsp;(</span><span class="number">0.00</span><span>&nbsp;sec)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
</span>
<pre class="java" style="display: none" name="code">&nbsp;</pre><img src ="http://www.blogjava.net/rain1102/aggbug/314917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-03-09 10:25 <a href="http://www.blogjava.net/rain1102/archive/2010/03/09/314917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目中遇到的性能问题总结</title><link>http://www.blogjava.net/rain1102/archive/2009/08/05/289965.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 05 Aug 2009 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/08/05/289965.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/289965.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/08/05/289965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/289965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/289965.html</trackback:ping><description><![CDATA[<p>最近一直从事的项目中遇到不少性能问题, 虽然表中的数据数量不是太大, 最大也就200万条, 其他基本都是100万左右, 但由于存在一个化合物结构信息的数据使得数据库特别的大, 就dmp文件就达到4G多。而客户对性能要求又比较高。目前遇到问题以及解决方案(并非最佳方案)总结如下:<br />
</p>
1. 多表查询时候速度慢: 为表之间关联列创建索引, 只取需要数据。<br />
2. 多条数据批量更新: 尽量使用原生SQL, 少用Hibernate取了循环再更新。<br />
3. 数据量大查询时候少用upper，lower等类似数据提供的功能函数去转换数据，可以考虑是否在存入数据之前就把所有数据改为大写或者小写，显示时候再按要求格式化内容。<br />
4. 使用Hibernate时候，把关联关系尽量设置成延迟加载，然后使用时候再用fetch取出。<br />
<br />
目前先总结这些， 遇到再加。<img src ="http://www.blogjava.net/rain1102/aggbug/289965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-08-05 16:27 <a href="http://www.blogjava.net/rain1102/archive/2009/08/05/289965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用CSVJDBC导入CSV文件数据到MySQL中</title><link>http://www.blogjava.net/rain1102/archive/2009/08/04/289730.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 04 Aug 2009 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/08/04/289730.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/289730.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/08/04/289730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/289730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/289730.html</trackback:ping><description><![CDATA[一年前一个项目里面使用了CSVJDBC，当时觉得这个工具特别好，今天又遇到客户给我一个CSV文件，里面有20万的数据，需要导入到数据库中进行分析处理。所以首选当然是CSVJDBC了。具体代码实现如下：<br />
<br />
<p>package com.founder.demo;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.Connection;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.DriverManager;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.PreparedStatement;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.ResultSet;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.Statement;</p>
<p>public class ImportCSV {</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;<span style="color: #008000">&nbsp;// load the driver into memory<br />
</span>&nbsp;&nbsp;&nbsp;Class.forName("org.relique.jdbc.csv.CsvDriver");</p>
<p>&nbsp;&nbsp;&nbsp;<span style="color: #008000">// create a connection. The first command line parameter is assumed to<br />
&nbsp;&nbsp;&nbsp;//&nbsp; be the directory in which the .csv files are held<br />
</span>&nbsp;&nbsp;&nbsp;Connection conn = DriverManager<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getConnection("jdbc:relique:csv:H:\\PythonWorkSpace");</p>
<p>&nbsp;&nbsp;<span style="color: #008000">&nbsp;// create a Statement object to execute the query with<br />
</span>&nbsp;&nbsp;&nbsp;Statement stmt = conn.createStatement();</p>
<p>&nbsp;&nbsp;&nbsp;<span style="color: #008000">// Select the columns from csv file<br />
</span>&nbsp;&nbsp;&nbsp;ResultSet results = stmt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.executeQuery("SELECT ORDER_NO,ARTICLE_NO,CATALOG_NO,DESCRIPTION,QUANTITY,ISO_UNIT,UNIT,MDL_NO,CAS, "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ " MOLECULA,FORMULA,DENSITY,PRICE_EUR,UN_NO,DANGER_GR,DANGER_CLASS,ZUSATZGEFAHR1,ZUSATZGEFAHR2,R_PHRASES, "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ " S_PHRASES,DANGER_SYMBOL,STORAGE_TEMPERATURE FROM ABCR");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<span style="color: #008000">//MySQL<br />
</span>&nbsp;&nbsp;&nbsp;Class.forName("com.mysql.jdbc.Driver").newInstance();<br />
&nbsp;&nbsp;&nbsp;Connection con = <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.DriverManager<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getConnection(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"jdbc:mysql://localhost/chemicaldb?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"root", "root");<br />
<br />
&nbsp;&nbsp;&nbsp;String sql = "INSERT INTO meryer_abcr (ORDER_NO,ARTICLE_NO,CATALOG_NO,DESCRIPTION,QUANTITY,ISO_UNIT,UNIT,MDL_NO,CAS, "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ " MOLECULA_FORMULA,MOLECULAR_WEIGHT,DENSITY,PRICE_EUR,UN_NO,DANGER_GROUP,DANGER_CLASS,ZUSATZGEFAHR1,ZUSATZGEFAHR2,R_PHRASES, "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ " S_PHRASES,DANGER_SYMBOL,STORAGE_TEMPERATURE) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";<br />
<br />
&nbsp;&nbsp;&nbsp;PreparedStatement mstmt = con.prepareStatement(sql);<br />
<br />
&nbsp;&nbsp;&nbsp;<span style="color: #008000">// dump out the results&nbsp;and set params</span><br />
&nbsp;&nbsp;&nbsp;while (results.next()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(1, results.getString("ORDER_NO"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(2, results.getString("ARTICLE_NO"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(3, results.getString("CATALOG_NO"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(4, results.getString("DESCRIPTION"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(5, results.getString("QUANTITY"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(6, results.getString("ISO_UNIT"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(7, results.getString("UNIT"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(8, results.getString("MDL_NO"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(9, results.getString("CAS"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(10, results.getString("MOLECULA_FORMULA"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(11, results.getString("MOLECULAR_WEIGHT"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(12, results.getString("DENSITY"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(13, results.getString("PRICE_EUR"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(14, results.getString("UN_NO"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(15, results.getString("DANGER_GROUP"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(16, results.getString("DANGER_CLASS"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(17, results.getString("ZUSATZGEFAHR1"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(18, results.getString("ZUSATZGEFAHR2"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(19, results.getString("R_PHRASES"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(20, results.getString("S_PHRASES"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(21, results.getString("DANGER_SYMBOL"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.setString(22, results.getString("STORAGE_TEMPERATURE"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;mstmt.execute();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(results.getString("ORDER_NO"));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<span style="color: #008000">&nbsp;// clean up</span><br />
&nbsp;&nbsp;&nbsp;mstmt.close();<br />
&nbsp;&nbsp;&nbsp;con.close();<br />
&nbsp;&nbsp;&nbsp;results.close();<br />
&nbsp;&nbsp;&nbsp;stmt.close();<br />
&nbsp;&nbsp;&nbsp;conn.close();<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("Oops-&gt; " + e);<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;}</p>
<p>}<br />
<br />
其实很简单，和操作数据库一样，提供了类似数据中的SQL语句来操作CSV文件中的数据。</p><img src ="http://www.blogjava.net/rain1102/aggbug/289730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-08-04 11:27 <a href="http://www.blogjava.net/rain1102/archive/2009/08/04/289730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL中同步两个表中的某些字段</title><link>http://www.blogjava.net/rain1102/archive/2009/07/31/289324.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 31 Jul 2009 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/07/31/289324.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/289324.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/07/31/289324.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/289324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/289324.html</trackback:ping><description><![CDATA[<p>以前我们在写update的时候往往是使用 update tablename set columnname ＝ value这样的简单语法，而今天遇到一个需求，根据一张表中的数据来更新另外一张表中的某些字段值，比如有个A表和B表，A中有字段id，name，email，phone，cno，这里的cno也是唯一的，B表中有id，othercloumn，email，phone，cno，这时候想通过B中的email和phone值来更新A中的email和phone值。我们可以使用一下语句实现这个功能：<br />
<br />
<span style="color: #008000">update A, B set <br />
A.email= B.email, A.phone= B.phone<br />
where A.cno=B.cno</span></p>
<br />
<span style="color: #ff0000">Oracle</span>中可以如下方式实现：<br />
<span style="color: #ff0000">update A set <br />
(email, phone) = (select B.email, B.phone where B.cno=&nbsp;A.cno)</span><br /><img src ="http://www.blogjava.net/rain1102/aggbug/289324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-07-31 22:14 <a href="http://www.blogjava.net/rain1102/archive/2009/07/31/289324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Python发送Post请求</title><link>http://www.blogjava.net/rain1102/archive/2009/07/28/288723.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 28 Jul 2009 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/07/28/288723.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/288723.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/07/28/288723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/288723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/288723.html</trackback:ping><description><![CDATA[<p>由于有很多数据需要逐个翻译，手工处理比较麻烦，花了十来分钟写了个python程序去跑，轻松了很多。具体代码如下：</p>
<p>#encoding=utf-8<br />
from __future__ import with_statement<br />
import MySQLdb<br />
import urllib<br />
from lister import ListerTR</p>
<p>conn = MySQLdb.connect(host="localhost", user="root", passwd="root", db="coocoo", charset="utf8")<br />
cursor = conn.cursor()<br />
cursor.execute("select id, enname from compound where enname != '' and zhname = '' order by id")<br />
row=cursor.fetchall()<br />
for r in row:<br />
&nbsp;&nbsp;&nbsp; <span style="color: #008000">params = urllib.urlencode({'eng2chi':r[1]})&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">这里组织参数</span><br />
&nbsp;&nbsp;&nbsp; <span style="color: #008000">sock = urllib.urlopen("http://202.127.145.134/scdb/translate/translate.asp", params)&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">发送请求，并把参数传过去<br />
</span></span>&nbsp;&nbsp;&nbsp; html = sock.read()<br />
&nbsp;&nbsp;&nbsp; sock.close()<br />
&nbsp;&nbsp;&nbsp; p = ListerTR()&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">以下为解析返回的数据代码<br />
</span>&nbsp;&nbsp;&nbsp; p.feed(html)<br />
&nbsp;&nbsp;&nbsp; html = p.html<br />
&nbsp;&nbsp;&nbsp; if u"成功" in html:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = p.values[5]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = value.strip()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print r[0], r[1], data&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">取回翻译成功的内容更新数据库里面的值</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor.execute("update compound set zhname = %s where id=%s", (data, r[0])) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.commit()<br />
&nbsp;&nbsp;&nbsp; else:&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">把翻译失败的记录给文本文件中<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with open('failture.txt', 'a+') as f:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write(str(r[0])+" | "+str(r[1]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write('\n')<br />
cursor.close() <br />
conn.close() </p><img src ="http://www.blogjava.net/rain1102/aggbug/288723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-07-28 14:32 <a href="http://www.blogjava.net/rain1102/archive/2009/07/28/288723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在MySQL和Oracle中实现行合并</title><link>http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 24 Jun 2009 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/283867.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/283867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/283867.html</trackback:ping><description><![CDATA[我有一个表student, 有id, name, email, 这时候我表里记录有name重复的值, 而email不一样, 我想按照name来group by一下, 把有重复的数据里面的email用逗号分开写在一起.<br />
表结构以及数据如下:<br />
id&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; email <br />
1&nbsp;&nbsp; eric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhourui@founder.com<br />
2&nbsp;&nbsp; maggie&nbsp;&nbsp;&nbsp; maggie@163.com<br />
3&nbsp;&nbsp; scott&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scott@yahoo.com<br />
4&nbsp;&nbsp; eric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eric@163.com<br />
我想的到如下数据<br />
eric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhourui@founder.com,eric@163.com<br />
maggie&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maggie@163.com<br />
scott&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scott@yahoo.com<br />
<br />
如果使用MySQL, 则实现语句如下:<br />
select name , <span style="color: #008000">group_concat(email order by email separator ", ")</span> as email from student group by name<br />
<br />
如果以上效果想在Oracle中显示, 则比较复杂点了, 因为Oracle中没有行合并函数, 则需要使用sys_connect_by_path()来实现, 代码如下:<br />
select name, ltrim(sys_connect_by_path(email,','),',') email from(<br />
select name,email,<br />
row_number() over(partition by name order by email) rn,<br />
count(*) over(partition by name) cnt<br />
from student <br />
) where level = cnt<br />
start with rn = 1<br />
connect by prior name = name and prior rn + 1 = rn<img src ="http://www.blogjava.net/rain1102/aggbug/283867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-24 09:18 <a href="http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 将Clob类型数据转换成字符串类型</title><link>http://www.blogjava.net/rain1102/archive/2009/06/03/279816.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 03 Jun 2009 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/03/279816.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/279816.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/03/279816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/279816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/279816.html</trackback:ping><description><![CDATA[很多时候会遇到排序或者联合处理clob类型数据, 而clob数据又不支持这两种操作, 所有需要把其转换为字符串来进行处理.<br />
<span style="color: #008000">dbms_lob.substr(clobcloum,2000,1)<br />
</span><br />
select id, name, coden<br />
&nbsp; from cims_supplier<br />
&nbsp;where name like 'A%'<br />
&nbsp;&nbsp; and coden like 'A%'<br />
union<br />
select cdbregno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_lob.substr(supplier_name,2000,1) as name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; coden&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as coden<br />
&nbsp; from acdsupplier_moltable<br />
&nbsp;where supplier_name like 'A%'<br />
&nbsp;&nbsp; and coden like 'A%'<br />
<br />
cims_supplier表中的name是varchar2类型, 而acdsupplier_moltable表中的supplier_name为clob类型, 这样就可以union了.<br />
当然排序也可以了.<br />
select * from t1 order by dbms_lob.substr(clobcloum,2000,1); <br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/279816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-03 15:11 <a href="http://www.blogjava.net/rain1102/archive/2009/06/03/279816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql5主从同步配置</title><link>http://www.blogjava.net/rain1102/archive/2009/04/15/265743.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 15 Apr 2009 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/04/15/265743.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/265743.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/04/15/265743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/265743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/265743.html</trackback:ping><description><![CDATA[<p>一. 安装包选择:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql-5.0.19.tar.gz</p>
<p>二. 安装环境:</p>
<p>主服务器:&nbsp;&nbsp; 192.168.0.201</p>
<p>从服务器:&nbsp;&nbsp; 192.168.0.00</p>
<p>三.主服务器配置:</p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建立用户<br />
grant replication slave on *.* to user001@192.168.0.200 identified by &#8216;111111&#8242;</p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑配置文件/etc/my.cnf<br />
server-id = 1<br />
log-bin=mysql-bin<br />
binlog-do-db=test<br />
binlog-ignore-db=mysql</p>
<p>&nbsp;</p>
<p>注:</p>
<p>&nbsp;# grant replication slave on *.* to &#8216;用户名&#8217;@'主机&#8217; identified by &#8216;密码&#8217;;<br />
# binlog-do-db=需要备份的数据库名，可写多行<br />
# binlog-ignore-db=不需要备份的数据库名，可写多行</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 可在B Slave上做连接测试: mysql -h 192.168.0.200 -u test -p</p>
<p>四.从服务器配置:</p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑/etc/my.cnf</p>
<p>server-id=2<br />
server-id=2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记得是两个???<br />
log-bin=mysql-bin<br />
master-host=192.168.0.201<br />
master-user=user001<br />
master-password=111111<br />
master-port=3306<br />
replicate-do-db=test<br />
replicate-do-db=test1<br />
# replicate-do-db=test&nbsp; 需要备份的数据库名<br />
# replicate-ignore-db=mysql 忽略的数据库<br />
# master-connect-retry=60 如果从服务器发现主服务器断掉，重新连接的时间差(秒)</p>
<p>先手动同步一下主从服务器中要备份的数据库，再重启主，从服务器。</p>
<p>五.验证是否配置正确:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; # mysql&gt;&nbsp; slave start;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; # mysql&gt;&nbsp; show slave status\G;</p>
<p>*************************** 1. row ***************************</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Slave_IO_State: Waiting for master to send event</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_Host: 192.168.0.201</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_User: repluser1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_Port: 3306</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connect_Retry: 60</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_Log_File: mysql-bin.000045</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Read_Master_Log_Pos: 212</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Relay_Log_File: sky-relay-bin.000054</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Relay_Log_Pos: 235</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Relay_Master_Log_File: mysql-bin.000045</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Slave_IO_Running: Yes</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Slave_SQL_Running: Yes</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Replicate_Do_DB: test,test1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Replicate_Ignore_DB: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Replicate_Do_Table: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; Replicate_Ignore_Table: </p>
<p>&nbsp;&nbsp;&nbsp; Replicate_Wild_Do_Table: </p>
<p>Replicate_Wild_Ignore_Table: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Last_Errno: 0</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Last_Error: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Skip_Counter: 0</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exec_Master_Log_Pos: 212</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Relay_Log_Space: 235</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Until_Condition: None</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Until_Log_File: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Until_Log_Pos: 0</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_SSL_Allowed: No</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_SSL_CA_File: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_SSL_CA_Path: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_SSL_Cert: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_SSL_Cipher: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master_SSL_Key: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seconds_Behind_Master: 0</p>
<p>1 row in set (0.00 sec)</p>
<p>确如如下行一致:<br />
Waiting for master to send event<br />
Slave_IO_Running: Yes<br />
Slave_SQL_Running: Yes</p>
<p>其他: ++主服务器上的相关命令<br />
show master status<br />
show slave hosts<br />
show logs<br />
show binlog events<br />
purge logs to &#8216;log_name&#8217;<br />
purge logs before &#8216;date&#8217;<br />
reset master(老版本flush master)<br />
set sql_log_bin=</p>
<p>++从服务器上的相关命令<br />
slave start<br />
slave stop<br />
SLAVE STOP IO_THREAD //此线程把master段的日志写到本地<br />
SLAVE start IO_THREAD<br />
SLAVE STOP SQL_THREAD //此线程把写到本地的日志应用于数据库<br />
SLAVE start SQL_THREAD<br />
reset slave<br />
SET GLOBAL SQL_SLAVE_SKIP_COUNTER<br />
load data from master<br />
show slave status(SUPER,REPLICATION CLIENT)<br />
CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= //动态改变master信息<br />
PURGE MASTER [before &#8216;date&#8217;] 删除master端已同步过的日志</p>
<p>++产生了mysql-bin.00000x文件可以删除</p>
<p>&nbsp;</p>
<p>附一: mysql无法启动:</p>
<p># /usr/local/mysql//bin/mysqld_safe --user=mysql --log-error=err.txt</p>
<p># more err.txt 根据里面的提示信息进行判断分析</p>
<p>&nbsp;</p>
<p>附二: 解决mysql&#8220;Access denied for user 'root'@'localhost'&#8221;</p>
<p>mysql -uroot -p<br />
Enter password:<br />
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)<br />
修改root用户的密码：<br />
# mysqladmin -uroot -p password 'newpassword' -</p>
<p>文章出处：http://www.diybl.com/course/6_system/linux/Linuxjs/2008622/127458.html</p><img src ="http://www.blogjava.net/rain1102/aggbug/265743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-04-15 14:02 <a href="http://www.blogjava.net/rain1102/archive/2009/04/15/265743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL外部访问</title><link>http://www.blogjava.net/rain1102/archive/2008/12/19/247350.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 19 Dec 2008 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/12/19/247350.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/247350.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/12/19/247350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/247350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/247350.html</trackback:ping><description><![CDATA[mysql 默认是禁止远程连接的，你在安装mysql的系统行运行mysql -uroot -p 后进入mysql<br />
如下：<br />
mysql&gt;use mysql;<br />
mysql&gt;grant all privileges on 数据库名字.* to '远程用户名<a href="mailto:'@'">'@'</a>远程IP地址' identified by '远程用户的密码';<br />
mysql&gt;flush privileges;<br />
mysql&gt;\q<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/247350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-12-19 15:41 <a href="http://www.blogjava.net/rain1102/archive/2008/12/19/247350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql日期和时间函数</title><link>http://www.blogjava.net/rain1102/archive/2008/12/12/245840.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 12 Dec 2008 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/12/12/245840.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/245840.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/12/12/245840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/245840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/245840.html</trackback:ping><description><![CDATA[下面的查询选择了所有记录，其date_col的值是在最后30天以内：&nbsp; <br />
<br />
mysql&gt;&nbsp;SELECT&nbsp;something&nbsp;FROM&nbsp;table&nbsp; <br />
WHERE&nbsp;TO_DAYS(NOW())&nbsp;-&nbsp;TO_DAYS(date_col)&nbsp;&lt;=&nbsp;30;&nbsp; <br />
<br />
DAYOFWEEK(date)&nbsp; <br />
返回日期date的星期索引(1=星期天，2=星期一,&nbsp;&#8230;&#8230;7=星期六)。这些索引值对应于ODBC标准。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DAYOFWEEK('1998-02-03');&nbsp; <br />
-&gt;&nbsp;3&nbsp; <br />
<br />
WEEKDAY(date)&nbsp; <br />
返回date的星期索引(0=星期一，1=星期二,&nbsp;&#8230;&#8230;6=&nbsp;星期天)。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEKDAY('1997-10-04&nbsp;22:23:00');&nbsp; <br />
-&gt;&nbsp;5&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEKDAY('1997-11-05');&nbsp; <br />
-&gt;&nbsp;2&nbsp; <br />
<br />
DAYOFMONTH(date)&nbsp; <br />
返回date的月份中日期，在1到31范围内。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DAYOFMONTH('1998-02-03');&nbsp; <br />
-&gt;&nbsp;3&nbsp; <br />
<br />
DAYOFYEAR(date)&nbsp; <br />
返回date在一年中的日数,&nbsp;在1到366范围内。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DAYOFYEAR('1998-02-03');&nbsp; <br />
-&gt;&nbsp;34&nbsp; <br />
<br />
MONTH(date)&nbsp; <br />
返回date的月份，范围1到12。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;MONTH('1998-02-03');&nbsp; <br />
-&gt;&nbsp;2&nbsp; <br />
<br />
DAYNAME(date)&nbsp; <br />
返回date的星期名字。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DAYNAME("1998-02-05");&nbsp; <br />
-&gt;&nbsp;'Thursday'&nbsp; <br />
<br />
MONTHNAME(date)&nbsp; <br />
返回date的月份名字。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;MONTHNAME("1998-02-05");&nbsp; <br />
-&gt;&nbsp;'February'&nbsp; <br />
<br />
QUARTER(date)&nbsp; <br />
返回date一年中的季度，范围1到4。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;QUARTER('98-04-01');&nbsp; <br />
-&gt;&nbsp;2&nbsp; <br />
<br />
WEEK(date)&nbsp; <br />
　&nbsp; <br />
WEEK(date,first)&nbsp; <br />
对于星期天是一周的第一天的地方，有一个单个参数，返回date的周数，范围在0到52。2个参数形式WEEK()允许 <br />
你指定星期是否开始于星期天或星期一。如果第二个参数是0，星期从星期天开始，如果第二个参数是1， <br />
从星期一开始。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEK('1998-02-20');&nbsp; <br />
-&gt;&nbsp;7&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEK('1998-02-20',0);&nbsp; <br />
-&gt;&nbsp;7&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEK('1998-02-20',1);&nbsp; <br />
-&gt;&nbsp;8&nbsp; <br />
<br />
YEAR(date)&nbsp; <br />
返回date的年份，范围在1000到9999。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;YEAR('98-02-03');&nbsp; <br />
-&gt;&nbsp;1998&nbsp; <br />
<br />
HOUR(time)&nbsp; <br />
返回time的小时，范围是0到23。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;HOUR('10:05:03');&nbsp; <br />
-&gt;&nbsp;10&nbsp; <br />
<br />
MINUTE(time)&nbsp; <br />
返回time的分钟，范围是0到59。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;MINUTE('98-02-03&nbsp;10:05:03');&nbsp; <br />
-&gt;&nbsp;5&nbsp; <br />
<br />
SECOND(time)&nbsp; <br />
回来time的秒数，范围是0到59。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;SECOND('10:05:03');&nbsp; <br />
-&gt;&nbsp;3&nbsp; <br />
<br />
PERIOD_ADD(P,N)&nbsp; <br />
增加N个月到阶段P（以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;PERIOD_ADD(9801,2);&nbsp; <br />
-&gt;&nbsp;199803&nbsp; <br />
<br />
PERIOD_DIFF(P1,P2)&nbsp; <br />
返回在时期P1和P2之间月数，P1和P2应该以格式YYMM或YYYYMM。注意，时期参数P1和P2不是日期值。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;PERIOD_DIFF(9802,199703);&nbsp; <br />
-&gt;&nbsp;11&nbsp; <br />
<br />
DATE_ADD(date,INTERVAL&nbsp;expr&nbsp;type)&nbsp; <br />
　&nbsp; <br />
DATE_SUB(date,INTERVAL&nbsp;expr&nbsp;type)&nbsp; <br />
　&nbsp; <br />
ADDDATE(date,INTERVAL&nbsp;expr&nbsp;type)&nbsp; <br />
　&nbsp; <br />
SUBDATE(date,INTERVAL&nbsp;expr&nbsp;type)&nbsp; <br />
这些功能执行日期运算。对于MySQL&nbsp;3.22，他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。 <br />
在MySQL&nbsp;3.23中，你可以使用+和-而不是DATE_ADD()和DATE_SUB()。（见例子）date是一个指定开始日期的 <br />
DATETIME或DATE值，expr是指定加到开始日期或从开始日期减去的间隔值一个表达式，expr是一个字符串；它可以以 <br />
一个&#8220;-&#8221;开始表示负间隔。type是一个关键词，指明表达式应该如何被解释。EXTRACT(type&nbsp;FROM&nbsp;date)函数从日期 <br />
中返回&#8220;type&#8221;间隔。下表显示了type和expr参数怎样被关联：&nbsp;type值&nbsp;含义&nbsp;期望的expr格式&nbsp; <br />
SECOND&nbsp;秒&nbsp;SECONDS&nbsp; <br />
MINUTE&nbsp;分钟&nbsp;MINUTES&nbsp; <br />
HOUR&nbsp;时间&nbsp;HOURS&nbsp; <br />
DAY&nbsp;天&nbsp;DAYS&nbsp; <br />
MONTH&nbsp;月&nbsp;MONTHS&nbsp; <br />
YEAR&nbsp;年&nbsp;YEARS&nbsp; <br />
MINUTE_SECOND&nbsp;分钟和秒&nbsp;"MINUTES:SECONDS"&nbsp; <br />
HOUR_MINUTE&nbsp;小时和分钟&nbsp;"HOURS:MINUTES"&nbsp; <br />
DAY_HOUR&nbsp;天和小时&nbsp;"DAYS&nbsp;HOURS"&nbsp; <br />
YEAR_MONTH&nbsp;年和月&nbsp;"YEARS-MONTHS"&nbsp; <br />
HOUR_SECOND&nbsp;小时,&nbsp;分钟，&nbsp;"HOURS:MINUTES:SECONDS"&nbsp; <br />
DAY_MINUTE&nbsp;天,&nbsp;小时,&nbsp;分钟&nbsp;"DAYS&nbsp;HOURS:MINUTES"&nbsp; <br />
DAY_SECOND&nbsp;天,&nbsp;小时,&nbsp;分钟,&nbsp;秒&nbsp;"DAYS&nbsp;HOURS:MINUTES:SECONDS"&nbsp; <br />
<br />
MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅 <br />
包含YEAR、MONTH和DAY部分(即，没有时间部分)，结果是一个DATE值。否则结果是一个DATETIME值。&nbsp; <br />
<br />
mysql&gt;&nbsp;SELECT&nbsp;"1997-12-31&nbsp;23:59:59"&nbsp;+&nbsp;INTERVAL&nbsp;1&nbsp;SECOND;&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp;00:00:00&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;INTERVAL&nbsp;1&nbsp;DAY&nbsp;+&nbsp;"1997-12-31";&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;"1998-01-01"&nbsp;-&nbsp;INTERVAL&nbsp;1&nbsp;SECOND;&nbsp; <br />
-&gt;&nbsp;1997-12-31&nbsp;23:59:59&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_ADD("1997-12-31&nbsp;23:59:59",&nbsp; <br />
INTERVAL&nbsp;1&nbsp;SECOND);&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp;00:00:00&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_ADD("1997-12-31&nbsp;23:59:59",&nbsp; <br />
INTERVAL&nbsp;1&nbsp;DAY);&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp;23:59:59&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_ADD("1997-12-31&nbsp;23:59:59",&nbsp; <br />
INTERVAL&nbsp;"1:1"&nbsp;MINUTE_SECOND);&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp;00:01:00&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_SUB("1998-01-01&nbsp;00:00:00",&nbsp; <br />
INTERVAL&nbsp;"1&nbsp;1:1:1"&nbsp;DAY_SECOND);&nbsp; <br />
-&gt;&nbsp;1997-12-30&nbsp;22:58:59&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_ADD("1998-01-01&nbsp;00:00:00",&nbsp; <br />
INTERVAL&nbsp;"-1&nbsp;10"&nbsp;DAY_HOUR);&nbsp; <br />
-&gt;&nbsp;1997-12-30&nbsp;14:00:00&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_SUB("1998-01-02",&nbsp;INTERVAL&nbsp;31&nbsp;DAY);&nbsp; <br />
-&gt;&nbsp;1997-12-02&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;EXTRACT(YEAR&nbsp;FROM&nbsp;"1999-07-02");&nbsp; <br />
-&gt;&nbsp;1999&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;EXTRACT(YEAR_MONTH&nbsp;FROM&nbsp;"1999-07-02&nbsp;01:02:03");&nbsp; <br />
-&gt;&nbsp;199907&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;EXTRACT(DAY_MINUTE&nbsp;FROM&nbsp;"1999-07-02&nbsp;01:02:03");&nbsp; <br />
-&gt;&nbsp;20102&nbsp; <br />
<br />
如果你指定太短的间隔值(不包括type关键词期望的间隔部分)，MySQL假设你省掉了间隔值的最左面部分。例如， <br />
如果你指定一个type是DAY_SECOND，值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值， <br />
MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说，"1:10"&nbsp;DAY_SECOND以它等价于"1:10"&nbsp;MINUTE_SECOND <br />
的方式解释，这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期， <br />
结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数，日子在新月用最大的天调整。&nbsp; <br />
<br />
mysql&gt;&nbsp;select&nbsp;DATE_ADD('1998-01-30',&nbsp;Interval&nbsp;1&nbsp;month);&nbsp; <br />
-&gt;&nbsp;1998-02-28&nbsp; <br />
<br />
注意，从前面的例子中词INTERVAL和type关键词不是区分大小写的。&nbsp; <br />
TO_DAYS(date)&nbsp; <br />
给出一个日期date，返回一个天数(从0年的天数)。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;TO_DAYS(950501);&nbsp; <br />
-&gt;&nbsp;728779&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;TO_DAYS('1997-10-07');&nbsp; <br />
-&gt;&nbsp;729669&nbsp; <br />
<br />
TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。&nbsp; <br />
<br />
FROM_DAYS(N)&nbsp; <br />
给出一个天数N，返回一个DATE值。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;FROM_DAYS(729669);&nbsp; <br />
-&gt;&nbsp;'1997-10-07'&nbsp; <br />
<br />
TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。&nbsp; <br />
<br />
DATE_FORMAT(date,format)&nbsp; <br />
根据format字符串格式化date值。下列修饰符可以被用在format字符串中：&nbsp;%M&nbsp;月名字(January&#8230;&#8230;December)&nbsp; <br />
%W&nbsp;星期名字(Sunday&#8230;&#8230;Saturday)&nbsp; <br />
%D&nbsp;有英语前缀的月份的日期(1st,&nbsp;2nd,&nbsp;3rd,&nbsp;等等。）&nbsp; <br />
%Y&nbsp;年,&nbsp;数字,&nbsp;4&nbsp;位&nbsp; <br />
%y&nbsp;年,&nbsp;数字,&nbsp;2&nbsp;位&nbsp; <br />
%a&nbsp;缩写的星期名字(Sun&#8230;&#8230;Sat)&nbsp; <br />
%d&nbsp;月份中的天数,&nbsp;数字(00&#8230;&#8230;31)&nbsp; <br />
%e&nbsp;月份中的天数,&nbsp;数字(0&#8230;&#8230;31)&nbsp; <br />
%m&nbsp;月,&nbsp;数字(01&#8230;&#8230;12)&nbsp; <br />
%c&nbsp;月,&nbsp;数字(1&#8230;&#8230;12)&nbsp; <br />
%b&nbsp;缩写的月份名字(Jan&#8230;&#8230;Dec)&nbsp; <br />
%j&nbsp;一年中的天数(001&#8230;&#8230;366)&nbsp; <br />
%H&nbsp;小时(00&#8230;&#8230;23)&nbsp; <br />
%k&nbsp;小时(0&#8230;&#8230;23)&nbsp; <br />
%h&nbsp;小时(01&#8230;&#8230;12)&nbsp; <br />
%I&nbsp;小时(01&#8230;&#8230;12)&nbsp; <br />
%l&nbsp;小时(1&#8230;&#8230;12)&nbsp; <br />
%i&nbsp;分钟,&nbsp;数字(00&#8230;&#8230;59)&nbsp; <br />
%r&nbsp;时间,12&nbsp;小时(hh:mm:ss&nbsp;[AP]M)&nbsp; <br />
%T&nbsp;时间,24&nbsp;小时(hh:mm:ss)&nbsp; <br />
%S&nbsp;秒(00&#8230;&#8230;59)&nbsp; <br />
%s&nbsp;秒(00&#8230;&#8230;59)&nbsp; <br />
%p&nbsp;AM或PM&nbsp; <br />
%w&nbsp;一个星期中的天数(0=Sunday&nbsp;&#8230;&#8230;6=Saturday&nbsp;）&nbsp; <br />
%U&nbsp;星期(0&#8230;&#8230;52),&nbsp;这里星期天是星期的第一天&nbsp; <br />
%u&nbsp;星期(0&#8230;&#8230;52),&nbsp;这里星期一是星期的第一天&nbsp; <br />
%%&nbsp;一个文字&#8220;%&#8221;。&nbsp; <br />
<br />
所有的其他字符不做解释被复制到结果中。&nbsp; <br />
<br />
mysql&gt;&nbsp;select&nbsp;DATE_FORMAT('1997-10-04&nbsp;22:23:00',&nbsp;'%W&nbsp;%M&nbsp;%Y');&nbsp; <br />
-&gt;&nbsp;'Saturday&nbsp;October&nbsp;1997'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DATE_FORMAT('1997-10-04&nbsp;22:23:00',&nbsp;'%H:%i:%s');&nbsp; <br />
-&gt;&nbsp;'22:23:00'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DATE_FORMAT('1997-10-04&nbsp;22:23:00',&nbsp; <br />
'%D&nbsp;%y&nbsp;%a&nbsp;%d&nbsp;%m&nbsp;%b&nbsp;%j');&nbsp; <br />
-&gt;&nbsp;'4th&nbsp;97&nbsp;Sat&nbsp;04&nbsp;10&nbsp;Oct&nbsp;277'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DATE_FORMAT('1997-10-04&nbsp;22:23:00',&nbsp; <br />
'%H&nbsp;%k&nbsp;%I&nbsp;%r&nbsp;%T&nbsp;%S&nbsp;%w');&nbsp; <br />
-&gt;&nbsp;'22&nbsp;22&nbsp;10&nbsp;10:23:00&nbsp;PM&nbsp;22:23:00&nbsp;00&nbsp;6'&nbsp; <br />
MySQL3.23中，在格式修饰符字符前需要%。在MySQL更早的版本中，%是可选的。&nbsp; <br />
<br />
TIME_FORMAT(time,format)&nbsp; <br />
这象上面的DATE_FORMAT()函数一样使用，但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。 <br />
其他修饰符产生一个NULL值或0。&nbsp; <br />
CURDATE()&nbsp; <br />
　&nbsp; <br />
CURRENT_DATE&nbsp; <br />
以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值，取决于函数是在一个字符串还是数字上下文被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;CURDATE();&nbsp; <br />
-&gt;&nbsp;'1997-12-15'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;CURDATE()&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;19971215&nbsp; <br />
<br />
CURTIME()&nbsp; <br />
　&nbsp; <br />
CURRENT_TIME&nbsp; <br />
以'HH:MM:SS'或HHMMSS格式返回当前时间值，取决于函数是在一个字符串还是在数字的上下文被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;CURTIME();&nbsp; <br />
-&gt;&nbsp;'23:50:26'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;CURTIME()&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;235026&nbsp; <br />
<br />
NOW()&nbsp; <br />
　&nbsp; <br />
SYSDATE()&nbsp; <br />
　&nbsp; <br />
CURRENT_TIMESTAMP&nbsp; <br />
以'YYYY-MM-DD&nbsp;HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间，取决于函数是在一个字符串还是在数字的 <br />
上下文被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;NOW();&nbsp; <br />
-&gt;&nbsp;'1997-12-15&nbsp;23:50:26'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;NOW()&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;19971215235026&nbsp; <br />
<br />
UNIX_TIMESTAMP()&nbsp; <br />
　&nbsp; <br />
UNIX_TIMESTAMP(date)&nbsp; <br />
如果没有参数调用，返回一个Unix时间戳记(从'1970-01-01&nbsp;00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一 <br />
个date参数被调用，它返回从'1970-01-01&nbsp;00:00:00'&nbsp;GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME <br />
字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;UNIX_TIMESTAMP();&nbsp; <br />
-&gt;&nbsp;882226357&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;UNIX_TIMESTAMP('1997-10-04&nbsp;22:23:00');&nbsp; <br />
-&gt;&nbsp;875996580&nbsp; <br />
<br />
当UNIX_TIMESTAMP被用于一个TIMESTAMP列，函数将直接接受值，没有隐含的&#8220;string-to-unix-timestamp&#8221;变换。&nbsp; <br />
<br />
FROM_UNIXTIME(unix_timestamp)&nbsp; <br />
以'YYYY-MM-DD&nbsp;HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值，取决于函数是在一个字符串 <br />
还是或数字上下文中被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;FROM_UNIXTIME(875996580);&nbsp; <br />
-&gt;&nbsp;'1997-10-04&nbsp;22:23:00'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;FROM_UNIXTIME(875996580)&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;19971004222300&nbsp; <br />
<br />
FROM_UNIXTIME(unix_timestamp,format)&nbsp; <br />
返回表示&nbsp;Unix&nbsp;时间标记的一个字符串，根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条 <br />
目同样的修饰符。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;FROM_UNIXTIME(UNIX_TIMESTAMP(),&nbsp; <br />
'%Y&nbsp;%D&nbsp;%M&nbsp;%h:%i:%s&nbsp;%x');&nbsp; <br />
-&gt;&nbsp;'1997&nbsp;23rd&nbsp;December&nbsp;03:43:30&nbsp;x'&nbsp; <br />
<br />
SEC_TO_TIME(seconds)&nbsp; <br />
返回seconds参数，变换成小时、分钟和秒，值以'HH:MM:SS'或HHMMSS格式化，取决于函数是在一个字符串还是在数字 <br />
上下文中被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;SEC_TO_TIME(2378);&nbsp; <br />
-&gt;&nbsp;'00:39:38'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;SEC_TO_TIME(2378)&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;3938&nbsp; <br />
<br />
TIME_TO_SEC(time)&nbsp; <br />
返回time参数，转换成秒。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;TIME_TO_SEC('22:23:00');&nbsp; <br />
-&gt;&nbsp;80580&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;TIME_TO_SEC('00:39:38');&nbsp; <br />
-&gt;&nbsp;2378 <br />
<br />
获取当前<br />
select current_date;<br />
select current_time;<img src ="http://www.blogjava.net/rain1102/aggbug/245840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-12-12 09:50 <a href="http://www.blogjava.net/rain1102/archive/2008/12/12/245840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL查询区分大小写</title><link>http://www.blogjava.net/rain1102/archive/2008/12/10/245562.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 10 Dec 2008 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/12/10/245562.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/245562.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/12/10/245562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/245562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/245562.html</trackback:ping><description><![CDATA[<p>CREATE TABLE students(<br />
&nbsp;&nbsp;&nbsp;&nbsp;name VARCHAR(10)<br />
);<br />
mysql查询默认是不区分大小写的 如：<br />
select * from students where&nbsp;name like 'a%'<br />
select * from students where&nbsp;name like 'A%'<br />
效果是一样的。<br />
要让mysql查询区分大小写，可以：<br />
select * from students where binary&nbsp;name like 'a%'<br />
select * from students where binary&nbsp;name like 'A%'</p>
<p>另一种办法是在数据库设计的时候，可能需要大小写敏感，解决方法是建表时候使用BINARY标示。<br />
CREATE TABLE students(<br />
&nbsp;&nbsp;&nbsp;&nbsp;name VARCHAR(10) <strong>BINARY</strong><br />
);</p>
<br />
如果修改已经存在的字段，使用如下SQL语句：<br />
alter table ecs_users change user_name user_name varchar(60) binary default '' not null<img src ="http://www.blogjava.net/rain1102/aggbug/245562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-12-10 20:32 <a href="http://www.blogjava.net/rain1102/archive/2008/12/10/245562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中Case的使用方法(下篇) (转载)</title><link>http://www.blogjava.net/rain1102/archive/2008/09/24/230840.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 24 Sep 2008 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/09/24/230840.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/230840.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/09/24/230840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/230840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/230840.html</trackback:ping><description><![CDATA[<strong>四，根据条件有选择的UPDATE。</strong> <br />
<br />
例，有如下更新条件
<ol>
    <li>工资5000以上的职员，工资减少10%
    <li>工资在2000到4600之间的职员，工资增加15% </li>
</ol>
很容易考虑的是选择执行两次UPDATE语句，如下所示 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #800080">--条件1</span>
<span style="color: #0000ff">UPDATE</span> Personnel
<span style="color: #0000ff">SET</span> salary = salary * 0.9
<span style="color: #0000ff">WHERE</span> salary &gt;= 5000;
<span style="color: #800080">--条件2</span>
<span style="color: #0000ff">UPDATE</span> Personnel
<span style="color: #0000ff">SET</span> salary = salary * 1.15
<span style="color: #0000ff">WHERE</span> salary &gt;= 2000 <span style="color: #0000ff">AND</span> salary &lt; 4600;
</pre>
<br />
但是事情没有想象得那么简单，假设有个人工资5000块。首先，按照条件1，工资减少10%，变成工资4500。接下来运行第二个SQL时候，因为这个人的工资是4500在2000到4600的范围之内， 需增加15%，最后这个人的工资结果是5175,不但没有减少，反而增加了。如果要是反过来执行，那么工资4600的人相反会变成减少工资。暂且不管这个规章是多么荒诞，如果想要一个SQL 语句实现这个功能的话，我们需要用到Case函数。代码如下: <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">UPDATE</span> Personnel
<span style="color: #0000ff">SET</span> salary = <span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> salary &gt;= 5000
　            <span style="color: #0000ff">THEN</span> salary * 0.9
<span style="color: #0000ff">WHEN</span> salary &gt;= 2000 <span style="color: #0000ff">AND</span> salary &lt; 4600
<span style="color: #0000ff">THEN</span> salary * 1.15
<span style="color: #0000ff">ELSE</span> salary <span style="color: #0000ff">END</span>;
</pre>
<br />
这里要注意一点，最后一行的ELSE salary是必需的，要是没有这行，不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL，这点是需要注意的地方。 <br />
这种方法还可以在很多地方使用，比如说变更主键这种累活。 <br />
一般情况下，要想把两条数据的Primary key,a和b交换，需要经过临时存储，拷贝，读回数据的三个过程，要是使用Case函数的话，一切都变得简单多了。 <br />
<table style="border-right: #1e7ab4 1px solid; padding-right: 0px; border-top: #1e7ab4 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: #1e7ab4 1px solid; padding-top: 0px; border-bottom: #1e7ab4 1px solid; border-collapse: collapse" width="300">
    <tbody>
        <tr>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">p_key</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">col_1</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">col_2</td>
        </tr>
        <tr>
            <td align="center">a</td>
            <td align="center">1</td>
            <td align="center">张三</td>
        </tr>
        <tr>
            <td align="center">b</td>
            <td align="center">2</td>
            <td align="center">李四</td>
        </tr>
        <tr>
            <td align="center">c</td>
            <td align="center">3</td>
            <td align="center">王五</td>
        </tr>
    </tbody>
</table>
<br />
<br />
假设有如上数据，需要把主键<code>a</code>和<code>b</code>相互交换。用Case函数来实现的话，代码如下 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">UPDATE</span> SomeTable
<span style="color: #0000ff">SET</span> p_key = <span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> p_key = <span style="color: #800080">'a'</span>
<span style="color: #0000ff">THEN</span> <span style="color: #800080">'b'</span>
<span style="color: #0000ff">WHEN</span> p_key = <span style="color: #800080">'b'</span>
<span style="color: #0000ff">THEN</span> <span style="color: #800080">'a'</span>
<span style="color: #0000ff">ELSE</span> p_key <span style="color: #0000ff">END</span>
<span style="color: #0000ff">WHERE</span> p_key <span style="color: #0000ff">IN</span> (<span style="color: #800080">'a'</span>, <span style="color: #800080">'b'</span>);
</pre>
<br />
同样的也可以交换两个Unique key。需要注意的是，如果有需要交换主键的情况发生，多半是当初对这个表的设计进行得不够到位，建议检查表的设计是否妥当。 <br />
<br />
<strong>五，两个表数据是否一致的检查。</strong> <br />
<br />
Case函数不同于DECODE函数。在Case函数中，可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS，可以进行子查询，从而 实现更多的功能。 <br />
下面具个例子来说明，有两个表，tbl_A,tbl_B，两个表中都有keyCol列。现在我们对两个表进行比较，tbl_A中的keyCol列的数据如果在tbl_B的keyCol列的数据中可以找到， 返回结果'Matched',如果没有找到，返回结果'Unmatched'。 <br />
要实现下面这个功能，可以使用下面两条语句 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #008000">--使用IN的时候</span>
<span style="color: #0000ff">SELECT</span> keyCol,
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> keyCol <span style="color: #0000ff">IN</span> ( <span style="color: #0000ff">SELECT</span> keyCol <span style="color: #0000ff">FROM</span> tbl_B )
<span style="color: #0000ff">THEN</span> <span style="color: #800080">'Matched'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #800080">'Unmatched'</span> <span style="color: #0000ff">END</span> Label
<span style="color: #0000ff">FROM</span> tbl_A;
<span style="color: #008000">--使用EXISTS的时候</span>
<span style="color: #0000ff">SELECT</span> keyCol,
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> EXISTS ( <span style="color: #0000ff">SELECT</span> * <span style="color: #0000ff">FROM</span> tbl_B
<span style="color: #0000ff">WHERE</span> tbl_A.keyCol = tbl_B.keyCol )
<span style="color: #0000ff">THEN</span> <span style="color: #800080">'Matched'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #800080">'Unmatched'</span> <span style="color: #0000ff">END</span> Label
<span style="color: #0000ff">FROM</span> tbl_A;
</pre>
<br />
使用IN和EXISTS的结果是相同的。也可以使用NOT IN和NOT EXISTS，但是这个时候要注意NULL的情况。 <br />
<br />
<strong>六，在Case函数中使用合计函数</strong> <br />
<br />
假设有下面一个表<br />
<table style="border-right: #1e7ab4 1px solid; padding-right: 1px; border-top: #1e7ab4 1px solid; padding-left: 1px; padding-bottom: 1px; border-left: #1e7ab4 1px solid; padding-top: 1px; border-bottom: #1e7ab4 1px solid; border-collapse: collapse">
    <tbody>
        <tr>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4"  noWrap align="center">学号(std_id)</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4"  noWrap align="center">课程ID(class_id)</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4"  noWrap align="center">课程名(class_name)</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4"  noWrap align="center">主修flag（main_class_flg)</td>
        </tr>
        <tr>
            <td align="center">100</td>
            <td align="center">1</td>
            <td align="center">经济学</td>
            <td align="center">Y</td>
        </tr>
        <tr>
            <td align="center">100</td>
            <td align="center">2</td>
            <td align="center">历史学</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">200</td>
            <td align="center">2</td>
            <td align="center">历史学</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">200</td>
            <td align="center">3</td>
            <td align="center">考古学</td>
            <td align="center">Y</td>
        </tr>
        <tr>
            <td align="center">200</td>
            <td align="center">4</td>
            <td align="center">计算机</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">300</td>
            <td align="center">4</td>
            <td align="center">计算机</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">400</td>
            <td align="center">5</td>
            <td align="center">化学</td>
            <td align="center">N</td>
        </tr>
        <tr>
            <td align="center">500</td>
            <td align="center">6</td>
            <td align="center">数学</td>
            <td align="center">N</td>
        </tr>
    </tbody>
</table>
<br />
有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生，要选择一门课程作为主修，主修flag里面写入 Y。只选择一门课程的学生，主修flag为N(实际上要是写入Y的话，就没有下面的麻烦事了，为了举例子，还请多多包含)。 <br />
现在我们要按照下面两个条件对这个表进行查询
<ol>
    <li>只选修一门课程的人，返回那门课程的ID
    <li>选修多门课程的人，返回所选的主课程ID </li>
</ol>
<br />
简单的想法就是，执行两条不同的SQL语句进行查询。 <br />
条件1 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #008000">--条件1：只选择了一门课程的学生</span>
<span style="color: #0000ff">SELECT</span> std_id, MAX(class_id) <span style="color: #0000ff">AS</span> main_class
<span style="color: #0000ff">FROM</span> Studentclass
<span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span> std_id
<span style="color: #0000ff">HAVING</span> COUNT(*) = 1;
</pre>
<br />
执行结果1 <br />
<pre class="src">STD_ID   MAIN_class
<span style="color: #008000">------   ----------</span>
300      4
400      5
500      6
</pre>
<br />
条件2 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #008000">--条件2：选择多门课程的学生</span>
<span style="color: #0000ff">SELECT</span> std_id, class_id <span style="color: #0000ff">AS</span> main_class
<span style="color: #0000ff">FROM</span> Studentclass
<span style="color: #0000ff">WHERE</span> main_class_flg = <span style="color: #800080">'Y'</span> ;
</pre>
<br />
执行结果2 <br />
<pre style="line-height: 109%; background-color: #fff7d6">STD_ID  MAIN_class
<span style="color: #008000">------  ----------</span>
100     1
200     3
</pre>
<br />
如果使用Case函数，我们只要一条SQL语句就可以解决问题，具体如下所示 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">SELECT</span>  std_id,
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> COUNT(*) = 1  <span style="color: #008000">--只选择一门课程的学生的情况</span>
<span style="color: #0000ff">THEN</span> MAX(class_id)
<span style="color: #0000ff">ELSE</span> MAX(<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> main_class_flg = <span style="color: #800080">'Y'</span>
<span style="color: #0000ff">THEN</span> class_id
<span style="color: #0000ff">ELSE</span> <span style="color: #0000ff">NULL</span> <span style="color: #0000ff">END</span>
)
<span style="color: #0000ff">END</span> <span style="color: #0000ff">AS</span> main_class
<span style="color: #0000ff">FROM</span> Studentclass
<span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span> std_id;
</pre>
<br />
运行结果 <br />
<pre style="line-height: 109%; background-color: #fff7d6">STD_ID   MAIN_class
<span style="color: #008000">------   ----------</span>
100      1
200      3
300      4
400      5
500      6
</pre>
<br />
通过在Case函数中嵌套Case函数，在合计函数中使用Case函数等方法，我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。 <br />
最后提醒一下使用Case函数的新手注意不要犯下面的错误 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">CASE</span> col_1
<span style="color: #0000ff">WHEN</span> 1    　   <span style="color: #0000ff">THEN</span> <span style="color: #800080">'Right'</span>
<span style="color: #0000ff">WHEN</span> <strong class="more">NULL</strong>  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'Wrong'</span>
<span style="color: #0000ff">END</span>
</pre>
<br />
在这个语句中When Null这一行总是返回unknown，所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL，这是一个错误的用法，这个时候我们应该选择用WHEN col_1 IS NULL。<img src ="http://www.blogjava.net/rain1102/aggbug/230840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-09-24 11:29 <a href="http://www.blogjava.net/rain1102/archive/2008/09/24/230840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中Case的使用方法(上篇)(转载)</title><link>http://www.blogjava.net/rain1102/archive/2008/09/24/230834.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 24 Sep 2008 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/09/24/230834.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/230834.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/09/24/230834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/230834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/230834.html</trackback:ping><description><![CDATA[<div class="postBody">Case具有两种格式。简单Case函数和Case搜索函数。
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #008000">--简单Case函数</span>
<span style="color: #0000ff">CASE</span> sex
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'1'</span> <span style="color: #0000ff">THEN</span> <span style="color: #800080">'男'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'2'</span> <span style="color: #0000ff">THEN</span> <span style="color: #800080">'女'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #800080">'其他'</span> <span style="color: #0000ff">END</span>
<span style="color: #008000">--Case搜索函数</span>
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> sex = <span style="color: #800080">'1'</span> <span style="color: #0000ff">THEN</span> <span style="color: #800080">'男'</span>
<span style="color: #0000ff">WHEN</span> sex = <span style="color: #800080">'2'</span> <span style="color: #0000ff">THEN</span> <span style="color: #800080">'女'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #800080">'其他'</span> <span style="color: #0000ff">END</span>
</pre>
<br />
这两种方式，可以实现相同的功能。简单Case函数的写法相对比较简洁，但是和Case搜索函数相比，功能方面会有些限制，比如写判断式。 <br />
还有一个需要注意的问题，Case函数只返回第一个符合条件的值，剩下的Case部分将会被自动忽略。 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #008000">--比如说，下面这段SQL，你永远无法得到&#8220;第二类&#8221;这个结果</span>
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> col_1 <span style="color: #0000ff"  ?>IN</span> ( <span style="color: #800080">'a'</span>, <span style="color: #800080">'b'</span>) <span style="color: #0000ff"  ?>THEN</span> <span style="color: #800080">'第一类'</span>
<span style="color: #0000ff">WHEN</span> col_1 <span style="color: #0000ff">IN</span> (<span style="color: #800080">'a'</span>)       <span style="color: #0000ff">THEN</span> <span style="color: #800080">'第二类'</span>
<span style="color: #0000ff">ELSE</span><span style="color: #800080">'其他'</span> <span style="color: #0000ff"  ?>END</span></pre>
<br />
下面我们来看一下，使用Case函数都能做些什么事情。 <br />
<br />
<strong>一，已知数据按照另外一种方式进行分组，分析。</strong> <br />
<br />
有如下数据:(为了看得更清楚，我并没有使用国家代码，而是直接用国家名作为Primary Key) <br />
<table style="border-right: #1e7ab4 1px solid; padding-right: 0px; border-top: #1e7ab4 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: #1e7ab4 1px solid; padding-top: 0px; border-bottom: #1e7ab4 1px solid; border-collapse: collapse" width="200">
    <tbody>
        <tr>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">国家（country）</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" bordercolor="#1e7ab4" align="center" width="100">人口（population）</td>
        </tr>
        <tr>
            <td align="center">中国</td>
            <td align="center">600</td>
        </tr>
        <tr>
            <td align="center">美国</td>
            <td align="center">100</td>
        </tr>
        <tr>
            <td align="center">加拿大</td>
            <td align="center">100</td>
        </tr>
        <tr>
            <td align="center">英国</td>
            <td align="center">200</td>
        </tr>
        <tr>
            <td align="center">法国</td>
            <td align="center">300</td>
        </tr>
        <tr>
            <td align="center">日本</td>
            <td align="center">250</td>
        </tr>
        <tr>
            <td align="center">德国</td>
            <td align="center">200</td>
        </tr>
        <tr>
            <td align="center">墨西哥</td>
            <td align="center">50</td>
        </tr>
        <tr>
            <td align="center">印度</td>
            <td align="center">250</td>
        </tr>
    </tbody>
</table>
<br />
根据这个国家人口数据，统计亚洲和北美洲的人口数量。应该得到下面这个结果。 <br />
<table style="border-right: #1e7ab4 1px solid; padding-right: 0px; border-top: #1e7ab4 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: #1e7ab4 1px solid; padding-top: 0px; border-bottom: #1e7ab4 1px solid; border-collapse: collapse" width="200">
    <tbody>
        <tr>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">洲</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">人口</td>
        </tr>
        <tr>
            <td align="center">亚洲</td>
            <td align="center">1100</td>
        </tr>
        <tr>
            <td align="center">北美洲</td>
            <td align="center">250</font></td>
        </tr>
        <tr>
            <td align="center">其他</td>
            <td align="center">700</td>
        </tr>
    </tbody>
</table>
<br />
想要解决这个问题，你会怎么做？生成一个带有洲Code的View，是一个解决方法，但是这样很难动态的改变统计的方式。 <br />
如果使用Case函数，SQL代码如下:
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">SELECT</span>  SUM(population),
<span style="color: #0000ff">CASE</span> country
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'中国'</span>     <span style="color: #0000ff">THEN</span> <span style="color: #800080">'亚洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'印度'</span>     <span style="color: #0000ff">THEN</span> <span style="color: #800080">'亚洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'日本'</span>     <span style="color: #0000ff">THEN</span> <span style="color: #800080">'亚洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'美国'</span>     <span style="color: #0000ff">THEN</span> <span style="color: #800080">'北美洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'加拿大'</span>  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'北美洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'墨西哥'</span>  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'北美洲'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #800080">'其他'</span> <span style="color: #0000ff">END</span>
<span style="color: #0000ff">FROM</span>    Table_A
<span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span> <span style="color: #0000ff">CASE</span> country
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'中国'</span>     <span style="color: #0000ff">THEN</span> <span style="color: #800080">'亚洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'印度'</span>     <span style="color: #0000ff">THEN</span> <span style="color: #800080">'亚洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'日本'</span>     <span style="color: #0000ff">THEN</span> <span style="color: #800080">'亚洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'美国'</span>     <span style="color: #0000ff">THEN</span> <span style="color: #800080">'北美洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'加拿大'</span>  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'北美洲'</span>
<span style="color: #0000ff">WHEN</span> <span style="color: #800080">'墨西哥'</span>  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'北美洲'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #800080">'其他'</span> <span style="color: #0000ff">END</span>;
</pre>
<br />
同样的，我们也可以用这个方法来判断工资的等级，并统计每一等级的人数。SQL代码如下； <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">SELECT</span>
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> salary &lt;= 500 <span style="color: #0000ff">THEN</span> <span style="color: #008000">'1'</span>
<span style="color: #0000ff">WHEN</span> salary &gt; 500 <span style="color: #0000ff">AND</span> salary &lt;= 600  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'2'</span>
<span style="color: #0000ff">WHEN</span> salary &gt; 600 <span style="color: #0000ff">AND</span> salary &lt;= 800  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'3'</span>
<span style="color: #0000ff">WHEN</span> salary &gt; 800 <span style="color: #0000ff">AND</span> salary &lt;= 1000 <span style="color: #0000ff">THEN</span> <span style="color: #800080">'4'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #0000ff">NULL</span> <span style="color: #0000ff">END</span> salary_class,
COUNT(*)
<span style="color: #0000ff">FROM</span>    Table_A
<span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span>
<span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> salary &lt;= 500 <span style="color: #0000ff">THEN</span> <span style="color: #008000">'1'</span>
<span style="color: #0000ff">WHEN</span> salary &gt; 500 <span style="color: #0000ff">AND</span> salary &lt;= 600  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'2'</span>
<span style="color: #0000ff">WHEN</span> salary &gt; 600 <span style="color: #0000ff">AND</span> salary &lt;= 800  <span style="color: #0000ff">THEN</span> <span style="color: #800080">'3'</span>
<span style="color: #0000ff">WHEN</span> salary &gt; 800 <span style="color: #0000ff">AND</span> salary &lt;= 1000 <span style="color: #0000ff">THEN</span> <span style="color: #800080">'4'</span>
<span style="color: #0000ff">ELSE</span> <span style="color: #0000ff">NULL</span> <span style="color: #0000ff">END</span>;
</pre>
<br />
<strong>二，用一个SQL语句完成不同条件的分组。</strong> <br />
<br />
有如下数据 <br />
<table id="Table1" style="border-right: #1e7ab4 1px solid; padding-right: 0px; border-top: #1e7ab4 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: #1e7ab4 1px solid; padding-top: 0px; border-bottom: #1e7ab4 1px solid; border-collapse: collapse" width="200">
    <tbody>
        <tr>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">国家（country）</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">性别（sex）</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">人口（population）</td>
        </tr>
        <tr>
            <td align="center">中国</td>
            <td align="center">1</td>
            <td align="center">340</td>
        </tr>
        <tr>
            <td align="center">中国</td>
            <td align="center">2</td>
            <td align="center">260</td>
        </tr>
        <tr>
            <td align="center">美国</td>
            <td align="center">1</td>
            <td align="center">45</td>
        </tr>
        <tr>
            <td align="center">美国</td>
            <td align="center">2</td>
            <td align="center">55</td>
        </tr>
        <tr>
            <td align="center">加拿大</td>
            <td align="center">1</td>
            <td align="center">51</td>
        </tr>
        <tr>
            <td align="center">加拿大</td>
            <td align="center">2</td>
            <td align="center">49</td>
        </tr>
        <tr>
            <td align="center">英国</td>
            <td align="center">1</td>
            <td align="center">40</td>
        </tr>
        <tr>
            <td align="center">英国</td>
            <td align="center">2</td>
            <td align="center">60</td>
        </tr>
    </tbody>
</table>
<br />
按照国家和性别进行分组，得出结果如下 <br />
<table id="Table2" style="border-right: #1e7ab4 1px solid; padding-right: 0px; border-top: #1e7ab4 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: #1e7ab4 1px solid; padding-top: 0px; border-bottom: #1e7ab4 1px solid; border-collapse: collapse" width="200">
    <tbody>
        <tr>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">国家</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">男</td>
            <td style="font-weight: bold; color: #ffffff; background-color: #1e7ab4" align="center" width="100">女</td>
        </tr>
        <tr>
            <td align="center">中国</td>
            <td align="center">340</td>
            <td align="center">260</td>
        </tr>
        <tr>
            <td align="center">美国</td>
            <td align="center">45</td>
            <td align="center">55</td>
        </tr>
        <tr>
            <td align="center">加拿大</td>
            <td align="center">51</td>
            <td align="center">49</td>
        </tr>
        <tr>
            <td align="center">英国</td>
            <td align="center">40</td>
            <td align="center">60</td>
        </tr>
    </tbody>
</table>
<br />
普通情况下，用UNION也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分)，而且SQL语句会比较长。 <br />
下面是一个是用Case函数来完成这个功能的例子 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">SELECT</span> country,
SUM( <span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> sex = <span style="color: #800080">'1'</span> <span style="color: #0000ff">THEN</span>
population <span style="color: #0000ff">ELSE</span> 0 <span style="color: #0000ff">END</span>),  <span style="color: #008000">--男性人口</span>
SUM( <span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> sex = <span style="color: #800080">'2'</span> <span style="color: #0000ff">THEN</span>
population <span style="color: #0000ff">ELSE</span> 0 <span style="color: #0000ff">END</span>)   <span style="color: #008000">--女性人口</span>
<span style="color: #0000ff">FROM</span>  Table_A
<span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span> country;
</pre>
<br />
这样我们使用Select，完成对二维表的输出形式，充分显示了Case函数的强大。 <br />
<br />
<strong>三，在Check中使用Case函数。</strong> <br />
<br />
在Check中使用Case函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check，那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。 <br />
下面我们来举个例子 <br />
公司A，这个公司有个规定，女职员的工资必须高于1000块。如果用Check和Case来表现的话，如下所示
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">CONSTRAINT</span> check_salary <span style="color: #0000ff">CHECK</span>
( <span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> sex = <span style="color: #800080">'2'</span>
<span style="color: #0000ff">THEN</span> <span style="color: #0000ff">CASE</span> <span style="color: #0000ff">WHEN</span> salary &gt; 1000
<span style="color: #0000ff">THEN</span> 1 <span style="color: #0000ff">ELSE</span> 0 <span style="color: #0000ff">END</span>
<span style="color: #0000ff">ELSE</span> 1 <span style="color: #0000ff">END</span> = 1 )
</pre>
<br />
如果单纯使用Check，如下所示 <br />
<pre style="line-height: 109%; background-color: #fff7d6"><span style="color: #0000ff">CONSTRAINT</span> check_salary <span style="color: #0000ff">CHECK</span>
( sex = <span style="color: #800080">'2'</span> <span style="color: #0000ff">AND</span> salary &gt; 1000 )
</pre>
<br />
女职员的条件倒是符合了，男职员就无法输入了。 <br />
<br />
<pre>USE pubs
GO
SELECT
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price &lt; 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END AS Range,
Title
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price &lt; 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
ORDER BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price &lt; 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
GO</pre>
<br />
</div><img src ="http://www.blogjava.net/rain1102/aggbug/230834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-09-24 11:20 <a href="http://www.blogjava.net/rain1102/archive/2008/09/24/230834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>删除重复记录</title><link>http://www.blogjava.net/rain1102/archive/2008/09/04/227080.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 04 Sep 2008 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/09/04/227080.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/227080.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/09/04/227080.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/227080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/227080.html</trackback:ping><description><![CDATA[<p dir="ltr"><strong>问题</strong><br />
从表中删除重复记录.<br />
<br />
<strong>解决方案<br />
</strong><span style="background-color: yellow"><span style="color: #000000"><span style="background-color: #ffffff">用带有聚集函数的子查询, 例如MIN, 任意选择保留的ID(本例中只保留每组中ID号最小的记录):<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">delete from dept&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where id not in (select min(id)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from dept&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group by name)<br />
</span></span></span></span><span style="background-color: yellow"><span style="background-color: #ffffff"><br />
</p>
</span></span><img src ="http://www.blogjava.net/rain1102/aggbug/227080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-09-04 22:52 <a href="http://www.blogjava.net/rain1102/archive/2008/09/04/227080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>复制表定义</title><link>http://www.blogjava.net/rain1102/archive/2008/09/04/227075.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 04 Sep 2008 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/09/04/227075.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/227075.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/09/04/227075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/227075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/227075.html</trackback:ping><description><![CDATA[<strong>问题<br />
</strong>要创建新表, 该表与已有表的列设置相同. 例如, 想要一个dept表的副本, 名未dept_2, 淡只是想复制表结构而不想复制源表中的记录.<br />
<br />
<strong>解决方案</strong><br />
DB2<br />
使用带有like子句的create table命令:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">create table dept_2 like dept<br />
</span><br />
Oracle, MySQL 和 PostgreSQL<br />
在create table命令中, 使用一个不返回任何行的子查询:<br />
&nbsp;&nbsp;&nbsp;<span style="color: #008000">&nbsp;create table dept_2<br />
&nbsp;&nbsp;&nbsp;&nbsp;as<br />
&nbsp;&nbsp;&nbsp;&nbsp;select * from dept where 1=0<br />
</span><br />
SQL Server<br />
使用带有不返回任何行的查询和into子句:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">select * into dept_2 from dept where 1=0</span><img src ="http://www.blogjava.net/rain1102/aggbug/227075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-09-04 22:34 <a href="http://www.blogjava.net/rain1102/archive/2008/09/04/227075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL查询按照子串排序</title><link>http://www.blogjava.net/rain1102/archive/2008/07/16/215298.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 16 Jul 2008 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/16/215298.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/215298.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/16/215298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/215298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/215298.html</trackback:ping><description><![CDATA[比如, 返回名字和职位, 需要按照职位的后两个字符排序.<br />
在DB2, MySQL, Oracle和PostgreSQL中, order by子句中使用substr函数:<br />
&nbsp;&nbsp;&nbsp;&nbsp;select ename, job from emp order by substr(job, length(job)-2)<br />
在SQL Server中, order by子句中使用substring函数:<br />
&nbsp;&nbsp;&nbsp;&nbsp;select ename, job from emp order by substring(job, len(job)-2, 2)<br /><img src ="http://www.blogjava.net/rain1102/aggbug/215298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-07-16 20:09 <a href="http://www.blogjava.net/rain1102/archive/2008/07/16/215298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>限制返回的行数和从表中随机返回n条记录</title><link>http://www.blogjava.net/rain1102/archive/2008/07/15/215062.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 15 Jul 2008 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/15/215062.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/215062.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/15/215062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/215062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/215062.html</trackback:ping><description><![CDATA[<p>在DB2中, 使用FETCH FIRST子句限制返回行数:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">select * from emp fetch first 5 rows only<br />
</span>使用RAND与ORDER BY和FETCH FIRST来获取随机条数<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">select * from emp order by rand()&nbsp;fetch first 5 rows only<br />
</span><br />
在MySQL和PostgreSQL中, 使用LIMIT:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">select * from emp limit 5<br />
</span>MySQL中获取随机行数:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">select * from emp order by rand()&nbsp;limit 5<br />
</span>PostgreSQL中获取随机行数:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">select * from emp order by random()&nbsp;limit 5<br />
</span><br />
在Oracle中, 在WHERE子句中通过使用ROWNUM来限制行数:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">select * from emp where rownum &lt;= 5<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">select *<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select ename, job from emp order by dbms_random.value()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;where rownum &lt;= 5<br />
</span>在SQL Server中, 使用TOP来限制返回行数:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">select top 5 * from emp<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">select top 5 ename, job from emp order by newid()</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/215062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-07-15 20:50 <a href="http://www.blogjava.net/rain1102/archive/2008/07/15/215062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中连接列值和在SELECT语句中使用条件逻辑</title><link>http://www.blogjava.net/rain1102/archive/2008/07/14/214821.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 14 Jul 2008 13:16:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/14/214821.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/214821.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/14/214821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/214821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/214821.html</trackback:ping><description><![CDATA[1连接列值<br />
使用concat函数连接来自多个列的数值. 在DB2, Oracle和PostgreSQL中,"||"是concat函数的简写方式,"+"是SQL Server中的简写方式.<br />
select <span style="color: #008000">name||' is a '||type</span> as msg from animal where ...<br />
select <span style="color: #008000">name+' is a '+type </span>as msg from animal where...<br />
select <span style="color: #008000">concat(name, ' is a ', type) </span>as msg from animal where ...<br />
<br />
2.在SELECT语句中使用条件逻辑<br />
case表达式可以针对查询的返回值执行条件逻辑. 可以给case表达式取别名, 使结果集更易读. else子句是可选的, 如果没有使用else, 对于不满足判断条件的行, case表达式会返回NULL.<br />
select ename, sal,<br />
&nbsp;&nbsp;<span style="color: #008000">&nbsp;case when sal&lt;=2000 then 'UNDERPAID'<br />
&nbsp;&nbsp; case when sal&gt;=4000 then 'OVERPAID'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else 'OK'<br />
&nbsp;&nbsp; end as status<br />
</span>from emp<img src ="http://www.blogjava.net/rain1102/aggbug/214821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-07-14 21:16 <a href="http://www.blogjava.net/rain1102/archive/2008/07/14/214821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>维护SQL Server数据库的一些常用SQL(转)</title><link>http://www.blogjava.net/rain1102/archive/2008/05/13/200246.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 13 May 2008 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/05/13/200246.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/200246.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/05/13/200246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/200246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/200246.html</trackback:ping><description><![CDATA[<p>1.如何创建数据库</p>
<p>CREATE DATABASE student</p>
<p>2.如何删除数据库</p>
<p>DROP DATABASE student</p>
<p>3.如何备份数据库到磁盘文件</p>
<p>BACKUP DATABASE student to disk=&#180;c:\1234.bak&#180;</p>
<p>4.如何从磁盘文件还原数据库</p>
<p>RESTORE DATABASE studnet FROM DISK = &#180;c:\1234.bak&#180;</p>
<p>5.怎样创建表？</p>
<p>CREATE TABLE Students (<br />
&nbsp;&nbsp;&nbsp; ID int IDENTITY ( 1, 1), --自增字段,基数1,步长1<br />
&nbsp;&nbsp;&nbsp; StudentID char (4) NOT NULL ,<br />
&nbsp;&nbsp;&nbsp; Name char (10) NOT NULL ,<br />
&nbsp;&nbsp;&nbsp; Age int NULL ,<br />
&nbsp;&nbsp;&nbsp; Birthday datetime NULL,<br />
&nbsp;&nbsp;&nbsp; CONSTRAINT PK_Students PRIMARY KEY (StudentID)&nbsp; --设置主键<br />
)</p>
<p>CREATE TABLE Subjects (<br />
&nbsp;&nbsp;&nbsp; ID int IDENTITY ( 1, 1), --自增字段,基数1,步长1<br />
&nbsp;&nbsp;&nbsp; ClassID char (4) NOT NULL ,<br />
&nbsp;&nbsp;&nbsp; ClassName char (10) NOT NULL,<br />
&nbsp;&nbsp;&nbsp; CONSTRAINT PK_Subjects PRIMARY KEY (ClassID)&nbsp;&nbsp;&nbsp; --设置主键<br />
)</p>
<p>CREATE TABLE Scores (<br />
&nbsp;&nbsp;&nbsp; ID int IDENTITY ( 1, 1), --自增字段,基数1,步长1<br />
&nbsp;&nbsp;&nbsp; StudentID char (4) NOT NULL ,<br />
&nbsp;&nbsp;&nbsp; ClassID char (4) NOT NULL ,<br />
&nbsp;&nbsp;&nbsp; Score float NOT NULL, <br />
&nbsp;&nbsp;&nbsp; CONSTRAINT FK_Scores_Students FOREIGN KEY (StudentID) REFERENCES Students(StudentID), --设置外键<br />
&nbsp;&nbsp;&nbsp; CONSTRAINT FK_Scores_Subjects FOREIGN KEY (ClassID) REFERENCES Subjects(ClassID), --设置外键<br />
&nbsp;&nbsp;&nbsp; CONSTRAINT PK_Scores PRIMARY KEY (StudentID,ClassID) --设置主键<br />
)</p>
<p>6.怎样删除表？</p>
<p>DROP TABLE Students </p>
<p>7.怎样创建视图？</p>
<p>CREATE VIEW s_s_s<br />
AS<br />
SELECT Students.Name, Subjects.ClassName, Scores.Score<br />
FROM Scores INNER JOIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Students ON Scores.StudentID = Students.StudentID INNER JOIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subjects ON Scores.ClassID = Subjects.ClassID</p>
<p><br />
8.怎样删除视图？</p>
<p>DROP VIEW s_s_s</p>
<p>9.如何创建存储过程?</p>
<p>CREATE PROCEDURE GetStudent<br />
@age INT,<br />
@birthday DATETIME<br />
AS<br />
SELECT *<br />
FROM students<br />
WHERE Age = @age AND Birthday = @birthday<br />
GO</p>
<p>10.如何删除存储过程?</p>
<p>DROP PROCEDURE GetStudent</p>
<p>11.如何创建触发器?</p>
<p>CREATE TRIGGER reminder<br />
ON Students<br />
FOR INSERT, UPDATE, DELETE <br />
AS<br />
&nbsp;&nbsp; EXEC master..xp_sendmail &#180;MaryM&#180;, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#180;Don&#180;&#180;t forget to print a report for the distributors.&#180;<br />
GO</p>
<p>12.如何删除触发器?</p>
<p>DROP TRIGGER reminder</p>
<p>13.如何创建索引?</p>
<p>CREATE UNIQUE INDEX IX_Students ON Students (Name)</p>
<p>14.如何删除索引?</p>
<p>DROP INDEX Students.IX_Students</p>
<p>15.怎样给表添加字段？</p>
<p>ALTER TABLE Students ADD Address varchar (50) NULL</p>
<p>16.怎样删除表中某个字段？</p>
<p>ALTER TABLE Students DROP COLUMN Address</p>
<p>17.如何设置列的标识属性?</p>
<p>没找到办法</p>
<p>18.如何去掉列的标识属性?</p>
<p>没有找到好的方法,只能是先添加一列,然后把标识列的值更新到新加入的列,删除标识列,再用与标识列相同的名字类型添加一列,用前面加入的列更新该列.如果该标识列是其他表的外键,还要先删除外键约束,很麻烦.谁有好的办法,还请告诉我.</p>
<p>19.如何重设标识列的标识种子?</p>
<p>DBCC CHECKIDENT (Student, RESEED, 1)</p>
<p>20.怎样给表加上主键？</p>
<p>ALTER TABLE Scores ADD CONSTRAINT PK_Scores PRIMARY KEY (StudentID,ClassID)</p>
<p>21.怎样删除表的主键？</p>
<p>ALTER TABLE Scores DROP CONSTRAINT PK_Scores</p>
<p>22.怎样给表添加一个外键？</p>
<p>ALTER TABLE Scores ADD CONSTRAINT FK_Scores_Students FOREIGN KEY (StudentID) REFERENCES Students (StudentID) ON DELETE CASCADE</p>
<p>23.怎样删除表的一个外键？</p>
<p>ALTER TABLE Scores DROP CONSTRAINT FK_Scores_Students</p>
<p>24.怎样给字段加上CHECK约束？</p>
<p>ALTER TABLE Students ADD CONSTRAINT CK_Students CHECK (Age &gt; 0)</p>
<p>25.怎样去掉字段上的CHECK约束？</p>
<p>ALTER TABLE Students DROP CONSTRAINT CK_Students </p>
<p>26.怎样给字段设置默认值？</p>
<p>ALTER TABLE Students ADD CONSTRAINT DF_Students_Age DEFAULT (18) FOR Age</p>
<p>27.怎样移去字段的默认值？</p>
<p>ALTER TABLE Students DROP CONSTRAINT DF_Students_Age</p>
<p>28.修改字段的类型及非空约束</p>
<p>ALTER TABLE Students ALTER COLUMN Age char (10) null<br />
ALTER TABLE Students ALTER COLUMN Age int not null </p><img src ="http://www.blogjava.net/rain1102/aggbug/200246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2008-05-13 17:15 <a href="http://www.blogjava.net/rain1102/archive/2008/05/13/200246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL下使用Hibernate的Query中setMaxResults方法出现错误</title><link>http://www.blogjava.net/rain1102/archive/2007/12/27/170767.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 26 Dec 2007 16:47:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/27/170767.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/170767.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/27/170767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/170767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/170767.html</trackback:ping><description><![CDATA[MySQL下使用Hibernate的Query中setMaxResults方法出现错误：<br />
System Runtime Error: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query <br />
这是因为MySQL不支持top，而是使用了limit！<br />
目前还没找到解决办法，不知道为什么Hibernate搞出这玩意，干吗不转换一下，还是bug呢！晕！ <br />
<br />
终于解决了，不是人家的错误，而是我自己弄错了。方言干错了！失败！<img src ="http://www.blogjava.net/rain1102/aggbug/170767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2007-12-27 00:47 <a href="http://www.blogjava.net/rain1102/archive/2007/12/27/170767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 导出所有表和所有数据</title><link>http://www.blogjava.net/rain1102/archive/2007/11/23/162575.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 23 Nov 2007 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/23/162575.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/162575.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/23/162575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/162575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/162575.html</trackback:ping><description><![CDATA[<p>mysqldump -u root -p --default-character-set=gbk jbpmtest [table1,table2,...] &gt; c:\jbpmtestdump.sql </p>
<p><br />
mysqldump -u root -p --default-character-set=gbk testAcegi &gt; c:\testAcegiDump.sql </p>
<p>mysqldump -u root -p --default-character-set=gbk knightsoft &gt; c:\knightsoft.sql </p><img src ="http://www.blogjava.net/rain1102/aggbug/162575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2007-11-23 11:22 <a href="http://www.blogjava.net/rain1102/archive/2007/11/23/162575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断sql执行所花的时间（精度为毫秒）</title><link>http://www.blogjava.net/rain1102/archive/2007/09/28/149059.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 28 Sep 2007 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/09/28/149059.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/149059.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/09/28/149059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/149059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/149059.html</trackback:ping><description><![CDATA[<span style="color: #0000ff">DECLARE </span><span style="color: #008000">@begin</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">datetime</span><span style="color: #000000"><br />
</span><span style="color: #0000ff"><span style="color: #0000ff">DECLARE </span></span><span style="color: #008000">@chaju</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">bigint</span><span style="color: #000000"><br />
</span><span style="color: #0000ff"><span style="color: #0000ff">DECLARE </span></span><span style="color: #008000">@end</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">datetime</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">SET </span><span style="color: #008000">@begin</span><span style="color: #808080">=</span><span style="color: #ff00ff">getdate</span><span style="color: #000000">()<br />
</span><span style="color: #000000"><font color="#0000ff"><br />
</font>要执行的sql语句......<br />
<br />
</span><span style="color: #0000ff"><span style="color: #0000ff">SET </span></span><span style="color: #008000">@end</span><span style="color: #808080">=</span><span style="color: #ff00ff">getdate</span><span style="color: #000000">()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff"><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span></span><span style="color: #008000">@chaju</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">datediff</span><span style="color: #000000">(Millisecond,&nbsp;</span><span style="color: #008000">@begin</span><span style="color: #000000">,&nbsp;</span><span style="color: #008000">@end</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">PRINT </span><span style="color: #008000">@chaju<span style="color: #000000">&nbsp;</span></span><img src ="http://www.blogjava.net/rain1102/aggbug/149059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2007-09-28 13:02 <a href="http://www.blogjava.net/rain1102/archive/2007/09/28/149059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Python操作MySQL</title><link>http://www.blogjava.net/rain1102/archive/2007/09/25/148037.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 25 Sep 2007 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/09/25/148037.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/148037.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/09/25/148037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/148037.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/148037.html</trackback:ping><description><![CDATA[首先下载MySQLdb，地址：http://sourceforge.net/projects/mysql-python/<br />
<p>1.&nbsp;&nbsp;&nbsp;使用<br />
&nbsp;&nbsp;&nbsp;&nbsp;import MySQLdb<br />
1.1.&nbsp;&nbsp;&nbsp;连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;conn =&nbsp;&nbsp;&nbsp;MySQLdb.Connection(host, user, password, dbname)<br />
1.2.&nbsp;&nbsp;&nbsp;选择数据库，如果上面没有指定数据库，则使用此方法指定！<br />
&nbsp;&nbsp;&nbsp;&nbsp;conn.select_db(&#8217;database name&#8217;)<br />
1.3.&nbsp;&nbsp;&nbsp;获得cursor<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur =&nbsp;&nbsp;&nbsp;conn.cursor()<br />
1.4.&nbsp;&nbsp;&nbsp;cursor位置设定<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.scroll(int, mode)<br />
&nbsp;&nbsp;&nbsp;&nbsp;mode可为相对位置或者绝对位置，分别为relative和absolute。<br />
1.5.&nbsp;&nbsp;&nbsp;select<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.execute(&#8216;select clause&#8217;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.execute(&#8216;select * from mytable&#8217;)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;row = cur.fetchall()<br />
&nbsp;&nbsp;&nbsp;&nbsp;或者：<br />
&nbsp;&nbsp;&nbsp;&nbsp;row1 = cur.fetchone()<br />
1.6.&nbsp;&nbsp;&nbsp;insert<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.execute(&#8216;inset clause&#8217;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.execute("insert into user (Name, Password) values ('maggie','12345')")<br />
&nbsp;&nbsp;&nbsp; conn.commit()</p>
<p>1.7.&nbsp;&nbsp;&nbsp;update<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.execute(&#8216;update&nbsp; clause&#8217;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.execute("update user set Name = 'eric chau' where id = 1")<br />
&nbsp;&nbsp;&nbsp;&nbsp;conn.commit()</p>
<p>1.8.&nbsp;&nbsp;&nbsp;delete<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.execute(&#8216;delete&nbsp; clause&#8217;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如<br />
&nbsp;&nbsp;&nbsp;&nbsp;cur.execute("delete from user where id = 1")<br />
&nbsp;&nbsp;&nbsp;&nbsp;conn.commit()<br />
<br />
<br />
完整代码：<br />
</p>
<p>from MySQLdb import Connect</p>
<p>def conn():<br />
&nbsp;&nbsp;&nbsp; #conn = Connect('localhost','root','root')<br />
&nbsp;&nbsp;&nbsp; #conn.select_db('eric')<br />
&nbsp;&nbsp;&nbsp; conn = Connect('localhost','root','root','eric')<br />
&nbsp;&nbsp;&nbsp; cur = conn.cursor()<br />
&nbsp;&nbsp;&nbsp; cur.execute('select * from user')<br />
&nbsp;&nbsp;&nbsp; cur.scroll(0)<br />
&nbsp;&nbsp;&nbsp; row1 = cur.fetchone()<br />
&nbsp;&nbsp;&nbsp; print 'id:', row1[0]<br />
&nbsp;&nbsp;&nbsp; print 'name:', row1[1]<br />
&nbsp;&nbsp;&nbsp; print 'password:', row1[2]<br />
&nbsp;&nbsp;&nbsp; #cur.execute("insert into user (Name, Password) values ('maggie','12345')")<br />
&nbsp;&nbsp;&nbsp; #cur.execute("update user set Name = 'eric chau' where id = 1")<br />
&nbsp;&nbsp;&nbsp; cur.execute("delete from user where id = 11")<br />
&nbsp;&nbsp;&nbsp; conn.commit()<br />
if __name__=='__main__':<br />
&nbsp;&nbsp;&nbsp; conn()</p><img src ="http://www.blogjava.net/rain1102/aggbug/148037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2007-09-25 13:22 <a href="http://www.blogjava.net/rain1102/archive/2007/09/25/148037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>