<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vimer的程序世界 &#187; 数据库</title>
	<atom:link href="http://www.vimer.cn/category/database/feed" rel="self" type="application/rss+xml" />
	<link>http://www.vimer.cn</link>
	<description></description>
	<lastBuildDate>Thu, 17 May 2012 11:40:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>最近的一些技术整理(20120109)</title>
		<link>http://www.vimer.cn/2012/01/%e6%9c%80%e8%bf%91%e7%9a%84%e4%b8%80%e4%ba%9b%e6%8a%80%e6%9c%af%e6%95%b4%e7%90%8620120109.html</link>
		<comments>http://www.vimer.cn/2012/01/%e6%9c%80%e8%bf%91%e7%9a%84%e4%b8%80%e4%ba%9b%e6%8a%80%e6%9c%af%e6%95%b4%e7%90%8620120109.html#comments</comments>
		<pubDate>Mon, 09 Jan 2012 12:41:19 +0000</pubDate>
		<dc:creator>Dante</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[xiangshuguo.com]]></category>

		<guid isPermaLink="false">http://www.vimer.cn/?p=2457</guid>
		<description><![CDATA[前段时间一直没写博客，昨天更新了一篇，今天突然又来了兴致，那就再更新一篇吧（所以说啊，治疗拖延症最好的方法就是现在开始做） 这篇还是一些技术的整理，主要是用于备忘，大家如... ]]></description>
			<content:encoded><![CDATA[<p>前段时间一直没写博客，昨天更新了一篇，今天突然又来了兴致，那就再更新一篇吧（所以说啊，治疗拖延症最好的方法就是现在开始做）</p>
<p>这篇还是一些技术的整理，主要是用于备忘，大家如果觉得太简单就一笑而过啦~</p>
<p><b>一. python通过图片内容判断图片类型</b></p>
<p>前段时间写了一个小站练手，<a href="http://xiangshuguo.com" target="_blank" >http://xiangshuguo.com</a>，一个支持自由上传的图片小站。</p>
<p>因为要限制上传图片的格式，所以要做文件类型检测，代码如下:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> get_image_type<span style="color: black;">&#40;</span>pd, is_path=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'
    获取图片的类型，支持传入路径和文件内容
    '</span><span style="color: #483d8b;">''</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> is_path:
        f = <span style="color: #008000;">file</span><span style="color: black;">&#40;</span>pd, <span style="color: #483d8b;">'rb'</span><span style="color: black;">&#41;</span>
        data = f.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'hex'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        data = pd.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'hex'</span><span style="color: black;">&#41;</span>
&nbsp;
    ftype = <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ffd8'</span><span style="color: black;">&#41;</span>:
        ftype = <span style="color: #483d8b;">'jpeg'</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'424d'</span><span style="color: black;">&#41;</span>:
        ftype = <span style="color: #483d8b;">'bmp'</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'474946'</span><span style="color: black;">&#41;</span>:
        ftype = <span style="color: #483d8b;">'gif'</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> data.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'89504e470d0a1a0a'</span><span style="color: black;">&#41;</span>:
        ftype = <span style="color: #483d8b;">'png'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> ftype</pre></td></tr></table></div>

<p><b>二. stringstream使用陷阱（1）</b><br />
我直接举一个例子吧</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">stringstream ss<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> x<span style="color: #008080;">;</span>
&nbsp;
ss <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;190&quot;</span><span style="color: #008080;">;</span>
ss <span style="color: #000080;">&gt;&gt;</span> x<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> x<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>这个代码是没有问题的，结果会是:</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">190</pre></div></div>

<p>如下的代码:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">stringstream ss<span style="color: #008080;">;</span>
string x<span style="color: #008080;">;</span>
&nbsp;
ss <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;190&quot;</span><span style="color: #008080;">;</span>
ss <span style="color: #000080;">&gt;&gt;</span> x<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> x<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>也是没有问题的，输出也是：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">190</pre></div></div>

<p>然而这样的代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">stringstream ss<span style="color: #008080;">;</span>
string x<span style="color: #008080;">;</span>
&nbsp;
ss <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;x y z&quot;</span><span style="color: #008080;">;</span>
ss <span style="color: #000080;">&gt;&gt;</span> x<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> x<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>输出将会是:</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">x</pre></div></div>

<p>好吧，看了文档才发现，当 stringstream将数据导出到一个字符串变量时，它会用空格分割。<br />
但说实话，同一个操作符，意义却不一样，这真挺让人纠结。。</p>
<p><b>三. stringstream使用陷阱（2）</b><br />
如果你习惯了C分割的atoi直接将空字符串转成0，那么用stringstream时，千万不要做这种事情，因为如下代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">stringstream ss<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> x<span style="color: #008080;">;</span>
ss <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008080;">;</span>
ss <span style="color: #000080;">&gt;&gt;</span> x<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> x<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>输出将并不一定是0。</p>
<p><b>四. MySQL多库表的查询方法</b><br />
腾讯内部使用MySQL数据库都是分库表的，所以在mysql中想手工查询个数据都会变得非常困难，所以这里放个简单的模板，要用的时候，只要用vim对应生成一下就可以了</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span><span style="color: #66cc66;">&#40;</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> db_app_right0<span style="color: #66cc66;">.</span>tb_app_right0
<span style="color: #993333; font-weight: bold;">UNION</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> db_app_right0<span style="color: #66cc66;">.</span>tb_app_right1
<span style="color: #66cc66;">&#41;</span><span style="color: #993333; font-weight: bold;">AS</span> t  <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #993333; font-weight: bold;">OUTFILE</span> <span style="color: #ff0000;">'/tmp/mx'</span>;</pre></td></tr></table></div>

<p><b>五. MySQL安全删除数据的做法</b><br />
这个其实是来自公司DBA的建议啦，这里分享一下</p>
<p>关于delete，我这里建议你们 做任何的delete操作之前先执行如下备份语句：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> backup<span style="color: #66cc66;">.</span>tablename <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> dbname<span style="color: #66cc66;">.</span>tablename  <span style="color: #993333; font-weight: bold;">WHERE</span> id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">90000</span>;
<span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">FROM</span> dbname<span style="color: #66cc66;">.</span>tablename  <span style="color: #993333; font-weight: bold;">WHERE</span> id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">90000</span>;</pre></td></tr></table></div>

<p>恢复语句：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">insert into dbname.<span style="color: #007788;">tablename</span> select <span style="color: #000040;">*</span> from backup.<span style="color: #007788;">tablename</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>还有一个习惯, 如果确信自己删的数据只有一条 加个 limit 1</p>
<p>OK，就这样</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vimer.cn/2012/01/%e6%9c%80%e8%bf%91%e7%9a%84%e4%b8%80%e4%ba%9b%e6%8a%80%e6%9c%af%e6%95%b4%e7%90%8620120109.html/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>搭建nginx+wordpress调试环境</title>
		<link>http://www.vimer.cn/2012/01/%e6%90%ad%e5%bb%banginxwordpress%e8%b0%83%e8%af%95%e7%8e%af%e5%a2%83.html</link>
		<comments>http://www.vimer.cn/2012/01/%e6%90%ad%e5%bb%banginxwordpress%e8%b0%83%e8%af%95%e7%8e%af%e5%a2%83.html#comments</comments>
		<pubDate>Sun, 08 Jan 2012 13:40:47 +0000</pubDate>
		<dc:creator>Dante</dc:creator>
				<category><![CDATA[MySql]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.vimer.cn/?p=2452</guid>
		<description><![CDATA[几年之前刚玩wordpress的时候，还是用apache+wordpress，而后来虽然自己成了nginx粉，却也只是用来做nginx+python的开发，没有把nginx+php配合起来。这次趁这要搭建wordpress的调试环境，所以重新梳理了... ]]></description>
			<content:encoded><![CDATA[<p>几年之前刚玩wordpress的时候，还是用apache+wordpress，而后来虽然自己成了nginx粉，却也只是用来做nginx+python的开发，没有把nginx+php配合起来。这次趁这要搭建wordpress的调试环境，所以重新梳理了一遍。<br />
PS：网上很多盛传的版本，基本都不太准，我这里算是亲身试验了，给大家个准的<br />
PS2：这次就在windows下来搞了，其实在linux也是一样</p>
<p>OK，我们正式开始</p>
<p><b>一. php安装部署</b></p>
<ol>
<li>到<a href="http://windows.php.net/download/" target="_blank" >php windows下载页面</a>下载zip包，而不是安装包</li>
<li>解压，我是解压到 D:\program\php5</li>
<li>重命名php.ini-production为php.ini</li>
<li>修改php.ini</li>
<p>    将如下代码去掉注释来支持mysql</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="conf" style="font-family:monospace;">extension=php_mysql.dll</pre></td></tr></table></div>

<p>    将如下代码去掉注释，来指明ext的路径</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="conf" style="font-family:monospace;">extension_dir = &quot;ext&quot;</pre></td></tr></table></div>

</ol>
<p><b>二. mysql安装部署</b></p>
<ol>
<li>到<a href="http://www.mysql.com/downloads/mysql/" target="_blank" >http://www.mysql.com/downloads/mysql/</a>下载windows版MySQL Community Server</li>
<li>安装，并启动服务（默认是随机启动，否则请 net start mysql）</li>
</ol>
<p><b>三. nginx安装部署</b></p>
<ol>
<li>到 <a href="http://www.nginx.org/" target="_blank" >http://www.nginx.org/</a>下载最新的nginx</li>
<li>解压，我是解压到 D:\program\nginx</li>
<li>可以新建如下三个bat脚本，可以快速的实现nginx在windows下的启动、停止、重载，放在与nginx.exe的统计目录即可</li>
<p>    start.bat</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bat" style="font-family:monospace;">%~d0
cd &quot;%~dp0&quot;
start nginx.exe</pre></td></tr></table></div>

<p>    stop.bat</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bat" style="font-family:monospace;">%~d0
cd &quot;%~dp0&quot;
start nginx.exe -s stop</pre></td></tr></table></div>

<p>    reloat.bat</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bat" style="font-family:monospace;">%~d0
cd &quot;%~dp0&quot;
start nginx.exe -s reload</pre></td></tr></table></div>

</ol>
<p><b>四. wordpress安装部署</b></p>
<ol>
<li>到 <a href="http://cn.wordpress.org/" target="_blank" >http://cn.wordpress.org/</a> 下载wordpress最新版 </li>
<li>解压，我是解压到D:\www\wp</li>
<li>在 D:\www\wp 目录下新建如下脚本</li>
<p>    start.bat</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bat" style="font-family:monospace;">D:/program/php5/php-cgi.exe -b 127.0.0.1:1998 -c D:/program/php5/php.ini</pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #000080;">set</span> wscriptObj = CreateObject(<span style="color: #800000;">&quot;Wscript.Shell&quot;</span>)
wscriptObj.run <span style="color: #800000;">&quot;start.bat&quot;</span>,0</pre></td></tr></table></div>

<p>    其中，start.bat可以能够启动fastcgi服务，但是会有一个dos窗口。如果用start.vbs的方式启动，就可以隐藏掉dos窗口。
</ol>
<p><b>五. 配置nginx</b></p>
<ol>
<li>修改nginx.conf，新建server配置如下</li>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="conf" style="font-family:monospace;">server {
    listen       80;
    server_name  wp.qq.com;
&nbsp;
    root         D:/www/wp;
&nbsp;
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
&nbsp;
    location / {
        fastcgi_pass   127.0.0.1:1998;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
&nbsp;
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            expires max;
            log_not_found off;
    }
}</pre></td></tr></table></div>

<p>    其中如下两项，你可能和我设置的不一样，自行修改就可以了</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="conf" style="font-family:monospace;">root         D:/www/wp;
fastcgi_pass   127.0.0.1:1998;</pre></td></tr></table></div>

<p>    而对于如下的静态化的配置，则一定要配置上，之前就是在这里调试了半天。。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="conf" style="font-family:monospace;">location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
}</pre></td></tr></table></div>

<li>重启nginx，OK！</li>
</ol>
<p>OK，访问 127.0.0.1，看下是否出现了wordpress的安装界面？哈哈，搞定！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vimer.cn/2012/01/%e6%90%ad%e5%bb%banginxwordpress%e8%b0%83%e8%af%95%e7%8e%af%e5%a2%83.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>SNS应用开发架构建议(2)-如果你的用户量达到100w</title>
		<link>http://www.vimer.cn/2011/07/sns%e5%ba%94%e7%94%a8%e5%bc%80%e5%8f%91%e6%9e%b6%e6%9e%84%e5%bb%ba%e8%ae%ae2-%e5%a6%82%e6%9e%9c%e4%bd%a0%e7%9a%84%e7%94%a8%e6%88%b7%e9%87%8f%e8%be%be%e5%88%b0100w.html</link>
		<comments>http://www.vimer.cn/2011/07/sns%e5%ba%94%e7%94%a8%e5%bc%80%e5%8f%91%e6%9e%b6%e6%9e%84%e5%bb%ba%e8%ae%ae2-%e5%a6%82%e6%9e%9c%e4%bd%a0%e7%9a%84%e7%94%a8%e6%88%b7%e9%87%8f%e8%be%be%e5%88%b0100w.html#comments</comments>
		<pubDate>Sun, 17 Jul 2011 12:27:32 +0000</pubDate>
		<dc:creator>Dante</dc:creator>
				<category><![CDATA[MySql]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[开放平台]]></category>
		<category><![CDATA[SNS应用]]></category>
		<category><![CDATA[SNS应用开发]]></category>
		<category><![CDATA[应用开发]]></category>

		<guid isPermaLink="false">http://www.vimer.cn/?p=2284</guid>
		<description><![CDATA[之前已经已经写过一篇《从开放平台建设者角度对应用开发者的一点架构建议(1)》，主要是介绍了最基本的openid、平台数据、应用内部数据的存储建议，这一次我们更深入一点。 对之前的文章... ]]></description>
			<content:encoded><![CDATA[<p>之前已经已经写过一篇《<a href="http://www.vimer.cn/2011/07/%e4%bb%8e%e5%bc%80%e6%94%be%e5%b9%b3%e5%8f%b0%e5%bb%ba%e8%ae%be%e8%80%85%e8%a7%92%e5%ba%a6%e5%af%b9%e5%ba%94%e7%94%a8%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84%e4%b8%80%e7%82%b9%e6%9e%b6%e6%9e%84%e5%bb%ba.html" target="_blank" >从开放平台建设者角度对应用开发者的一点架构建议(1)</a>》，主要是介绍了最基本的openid、平台数据、应用内部数据的存储建议，这一次我们更深入一点。</p>
<p>对之前的文章，我们提到了三种数据：</p>
<ul>
<li>openid-id</li>
<li>id-平台数据</li>
<li>id-应用数据</li>
</ul>
<p>相信大部分个人开发者的第一反应是，上面每份数据建一张表，之间建立很多外键关系。这样的确会有很大的好处，很多数据查询操作都可以直接通过sql语句完成，比如:</p>
<ol>
<li>通过openid查询id</li>
<li>通过id查询openid</li>
<li>通过用户名查询openid/id</li>
<li>通过应用数据查询openid/id</li>
</ol>
<p>上面的架构都很好的，并且开发成本非常低，但是这一切的前提是你的应用的用户量有多少。</p>
<p><b>100w是个坎，100w之前没有任何问题，100w之后，这种架构就是垃圾</b></p>
<p>很多人会说，对于一个小应用，考虑那么大量用户干嘛？你这是过度设计了吧。</p>
<p>有这种思想的人不少，没错，当年facebook过100w用户的时候，已经是一家有很多职员的公司了。那你会不会觉得，当我们的小应用成长为100w用户的时候，我们已经有了足够的资金，足够的职员，可以考虑重构了？</p>
<p>然而事实是，zynga新推出的游戏《帝国与同盟》在facebook上上线一周，日活跃就达到3000w，更别说注册用户量。而就国内的情况来说，在朋友网上面的任何一款应用，只要不是太差，1~2个月，注册用户基本就可以轻松达到100w。</p>
<p>是不是有些震撼？SNS应用的病毒式传播能力远超过我们的想象，而这所带来的结果，除了利益之外，在技术上也对架构提出了更高的要求。</p>
<p>请别误会我的意思，我并不是说一个个人开发的应用，一开始就要考虑 读写分离，异步写，将二层架构（webserver+db）变成三层架构（webserver+cache+db）甚至四层架构(webserver+logicserver+cache+db)，我的意思是，大系统开始要小做，但是不代表不给以后留下扩展的接口。</p>
<p>OK，到此为止，我所要表达的观点基本已经出来了：<br />
<b>对于一个小团队来说，我们可以继续保持webserver+db的两层结构，但是要为以后留有适当的扩展接口</b></p>
<p>听起来似乎有些抽象，但是实施起来却很简单：</p>
<ol>
<li>分库分表，即使所有的都库表都放在同一个mysql实体机上</li>
<li>要封装出数据库访问层，上层不需要知道访问的是的memcache还是mysql</li>
<li>将很多太依赖mysql的查询，放到业务层（比如自增key，比如外键查询）</li>
</ol>
<p>按照上面的原则，如下的问题就可以得到解决：</p>
<ol>
<li>注册用户数超过100w，导致单表查询性能降低，以及单机存不下的问题</li>
<li>数据访问频率变高，导致mysql需要迁移到memcache的问题</li>
</ol>
<p>OK，那么根据这个原则，我们从新来设计一下我们的底层数据库结构。</p>
<p><b>首先，冗余出一份id-openid的数据，来支持id到openid的查询。</b><br />
原来我们只有openid-id这样一个映射表，是因为mysql也可以直接通过id查询openid，然而一旦分库表之后，就不得不再冗余一份id-openid的映射表，但也确实是没有办法的事情（当然，如果你技术够牛，也可以自己实现一个双key cache）。</p>
<p><b>第二，将所有自增key的地方，替换为在某个地方存放当前id的最大值。</b><br />
既然要抛弃自增生成id的方法，那我们就需要一个地方来存储当前的最大id的值。这里用一个表来记录就可以了，因为毕竟每秒新注册的用户还是很少的</p>
<p><b>第三，将openid-id,id-openid,id-平台数据,id-应用数据，分库分表。</b><br />
最简单的方法就是取模，id=1234，如果10库10表的话，千位和百位对应库，十位和个位对应表，那就是db_2和tb_4。当然，在某些框架，如django上不方便分表，那么也可以只分库，比如分100库，落到db_34。我们这里采用只分库，不分表的方式，我们分1000库，这样等到你有10亿用户的时候，每个表也才100w条记录，一定是够用了。</p>
<p>具体怎么分呢？实际上，我们有更简单的方法，如下:</p>
<table border="1">
<tr>
<td>库名</td>
<td>包含的表</td>
</tr>
<tr>
<td>db_app_single</td>
<td>
            id_alloc
        </td>
<tr>
<td>db_app_openmod_0 ~ db_app_openmod_999</td>
<td>
            openid2id
        </td>
</tr>
<tr>
<td>db_app_idmod_0 ~ db_app_idmod_999</td>
<td>
            id-openid<br />
            id-平台数据<br />
            id-应用数据
        </td>
</tr>
</table>
<p>OK，这样我们整个架构对于抗大量用户的能力就大大加强了，而且扩展性也比原来的架构要好很多。以后一旦访问量的瓶颈达到之后，我们就可以把db的直接访问变成访问cache，或者考虑其他的优化方案，如前面提到的读写分离，异步写等等。</p>
<p>好啦，就这样~，希望文中的建议能给已经是个人应用开发者，或者即将成为个人应用开发者的朋友有所帮助~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vimer.cn/2011/07/sns%e5%ba%94%e7%94%a8%e5%bc%80%e5%8f%91%e6%9e%b6%e6%9e%84%e5%bb%ba%e8%ae%ae2-%e5%a6%82%e6%9e%9c%e4%bd%a0%e7%9a%84%e7%94%a8%e6%88%b7%e9%87%8f%e8%be%be%e5%88%b0100w.html/feed</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>抽离CodeIgniter的数据库访问类！</title>
		<link>http://www.vimer.cn/2010/11/%e6%8a%bd%e7%a6%bbcodeigniter%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%bf%e9%97%ae%e7%b1%bb%ef%bc%81.html</link>
		<comments>http://www.vimer.cn/2010/11/%e6%8a%bd%e7%a6%bbcodeigniter%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%bf%e9%97%ae%e7%b1%bb%ef%bc%81.html#comments</comments>
		<pubDate>Mon, 15 Nov 2010 12:00:00 +0000</pubDate>
		<dc:creator>Dante</dc:creator>
				<category><![CDATA[MySql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Active Record]]></category>
		<category><![CDATA[ado]]></category>
		<category><![CDATA[ci]]></category>
		<category><![CDATA[CodeIgniter]]></category>

		<guid isPermaLink="false">http://www.vimer.cn/2010/11/%e6%8a%bd%e7%a6%bbcodeigniter%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%bf%e9%97%ae%e7%b1%bb%ef%bc%81.html</guid>
		<description><![CDATA[好吧，因为组织需要，最近又开始转战php了，业务逻辑都还好说，主要是老大要求在数据访问层上加上登录态验证。 其实这种要求也是合理的，互联网服务要求上层保护下层，但下层不能完全... ]]></description>
			<content:encoded><![CDATA[<p>好吧，因为组织需要，最近又开始转战php了，业务逻辑都还好说，主要是老大要求在数据访问层上加上登录态验证。<br /> 其实这种要求也是合理的，互联网服务要求上层保护下层，但下层不能完全相信上层。但是问题也就来了，有如下两种方案：</p>
<p>  1.写一个mysql proxy server，用来将调用方发来的请求拼装，然后返回给调用侧。这样做的主要难度在于：
<ul>
<li>a）SQL语句的拼装及序列化</li>
<li>b）数据集序列化，虽然有不少这方面的产品，但是终究还是太过复杂，而且没有时间折腾</li>
</ul>
<p> 果断放弃。<br /> 2.封装一层mysql的api，调用方直接在本地调用即可。这样的话，只需要考虑SQL语句的拼装即可。现在就有很多选择啦，
<ul>
<li>a）使用类似django里面Model的模型类</li>
<li>b）使用ci中的Active Record</li>
</ul>
<p> 虽然说Model的方式，对数据层的屏蔽较好，但是小组成员普遍认为这种方式过重，轻量的一点的话，最终还是选择了CodeIgniter中的AR。<br /> OK，那么现在，考验ci模块拆分的好不好的时候到啦！<br /> 具体中间的种种辛苦就不说啦，直说我最终的实现把，拷贝system\database到一个单独的目录，x:/php/ 。<br /> 创建一个文件myconfig.php：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BASEPATH'</span><span style="color: #339933;">,</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'EXT'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span>BASEPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'database/DB'</span> <span style="color: #339933;">.</span> EXT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> <span style="color: #339933;">&amp;</span>instantiate_class<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$class_object</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$class_object</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> log_message<span style="color: #009900;">&#40;</span><span style="color: #000088;">$level</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'error'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #339933;">,</span> <span style="color: #000088;">$php_error</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">function</span> MYDB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$params</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'dbdriver'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'mysql'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'hostname'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'username'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'password'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'database'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'dante'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'pconnect'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'db_debug'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'cache_on'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'char_set'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'dbcollat'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'utf8_general_ci'</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> DB<span style="color: #009900;">&#40;</span><span style="color: #000088;">$params</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$db</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>创建一个测试文件test.php：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'myconfig.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> MYDB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ID,user_login,user_email'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'wp_users'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">result</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ID</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_login</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_email</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>输入结果如下：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">Database Driver Class Initialized
1
admin
zny2008@gmail.com</pre></div></div>

<p>OK啦~~~ 这样我们如果要在数据访问前需要做权限校验的话，只需要在MYDB函数中做判断即可。<br />
另外，不得不说ci模块拆分的确实不错，instantiate_class是来自于它的system\codeigniter\Common.php。log_message我给重写了一下，因为对于每个调用者来说，希望写log的方式是不一样的。（比如我这次就直接打印在了屏幕上。。。。），最近正好在看设计模式，这种方式也是符合模版方法模式的。</p>
<p>ps：<br />
《php敏捷开发框架CodeIgniter - 快速web应用开发详解》这本书中关于ar的用法中的例子居然是错的，害得我看源码才发现问题，书中的例子是这样的：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'name'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'clientid'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'people.surname AS client'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>而实际应该是这样的：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url,name,clientid,people.surname AS client'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>代码下载(以后代码都会像这样，统一放到google code上下载)：<br />
<a href="http://vimercode.googlecode.com/svn/trunk/ci_model/" target="_blank">http://vimercode.googlecode.com/svn/trunk/ci_model/</a><br />
----------------------------------------------------------<br />
补充一下，当数据库链接出现问题的时候，会调用DB_driver.php中的display_error函数，里面会调用更多的类，为了不引入太多的类，直接改成：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> display_error<span style="color: #009900;">&#40;</span><span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$swap</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$native</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;数据库链接出错，请稍候再试&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.vimer.cn/2010/11/%e6%8a%bd%e7%a6%bbcodeigniter%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%bf%e9%97%ae%e7%b1%bb%ef%bc%81.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>关于mysql_free_result和mysql_close的解惑</title>
		<link>http://www.vimer.cn/2010/10/%e5%85%b3%e4%ba%8emysql_free_result%e5%92%8cmysql_close%e7%9a%84%e8%a7%a3%e6%83%91.html</link>
		<comments>http://www.vimer.cn/2010/10/%e5%85%b3%e4%ba%8emysql_free_result%e5%92%8cmysql_close%e7%9a%84%e8%a7%a3%e6%83%91.html#comments</comments>
		<pubDate>Mon, 11 Oct 2010 09:23:14 +0000</pubDate>
		<dc:creator>Dante</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql_close]]></category>
		<category><![CDATA[mysql_free_result]]></category>
		<category><![CDATA[mysql_store_result]]></category>

		<guid isPermaLink="false">http://www.vimer.cn/2010/10/%e5%85%b3%e4%ba%8emysql_free_result%e5%92%8cmysql_close%e7%9a%84%e8%a7%a3%e6%83%91.html</guid>
		<description><![CDATA[之前用mysql的时候一直是在用短链接，调用mysql_store_result获取一次数据之后就直接调用： 1 2 mysql_free_result&#40;m_result&#41;; mysql_close&#40;m_Database&#41;; 但是有两个问题： 1.当使用长连接时（即connect... ]]></description>
			<content:encoded><![CDATA[<p>之前用mysql的时候一直是在用短链接，调用mysql_store_result获取一次数据之后就直接调用：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">mysql_free_result<span style="color: #008000;">&#40;</span>m_result<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
mysql_close<span style="color: #008000;">&#40;</span>m_Database<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>但是有两个问题：<br />
1.当使用长连接时（即connect之后一直不close），如果最后会调用mysql_close，需不需要每次都调用mysql_free_result呢?<br />
2.当mysql_close调用之后，m_result的数据是否还可以用。</p>
<p>先说一下结论：<br />
1.必须每次调用。因为经过测试，每次mysql_store_result的指针都是不同的，可见并不是共享了同一块buf。<br />
2.还是可以使用。经过valgrind扫描，只调用mysql_close的扫描结果是：</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">==9397== 16,468 (88 direct, 16,380 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 5
==9397==    at 0x40219B3: malloc (vg_replace_malloc.c:195)
==9397==    by 0x8053EA2: my_malloc (in /data/home/dantezhu/appbase/application/platform/openqqcom/share/db_openright/test/test)
==9397==    by 0x806D314: mysql_store_result (in /data/home/dantezhu/appbase/application/platform/openqqcom/share/db_openright/test/test)
==9397==    by 0x804BB04: CMySQLCppClient::Result(st_mysql_res*&amp;) (mysql_cpp_client.cpp:127)
==9397==    by 0x804AB58: CDBOpenRight::GetUinsByApp(unsigned int, std::set&lt;unsigned int, std::less&lt;unsigned int&gt;, std::allocator&lt;unsigned int&gt; &gt;&amp;) (db_openright.cpp:58)
==9397==    by 0x8049F10: main (test.cpp:27)</pre></div></div>

<p>这里连同测试代码和我之前写的一个简单的C++封装的mysql库一起放出下载，有需要的同学可以下载试试：<br />
<a href="http://www.vimer.cn/wp-content/uploads/2010/10/db_openright.tar.gz">代码下载</a></p>
<p>其中只有mysql_cpp_client.h和mysql_cpp_client.cpp是核心文件，其他均为测试代码.</p>
<p>里面有简单的演示，如查询：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">char</span> strSql<span style="color: #008000;">&#91;</span>MAX_QUERYLEN_OPENRIGHT<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>strSql,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>strSql<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;select uin <span style="color: #000099; font-weight: bold;">\
</span>        from %s where appid=%u;&quot;</span>,OPENRIGHT_TB_CARE,appid<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> ret<span style="color: #008080;">;</span>
&nbsp;
ret <span style="color: #000080;">=</span> m_SqlClient.<span style="color: #007788;">Execute</span><span style="color: #008000;">&#40;</span>strSql<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>ret<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>   
    <span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>m_StrErrMsg,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>m_StrErrMsg<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;[%s][%d][%s]Error:[%d][%s]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
            __FILE__,__LINE__,__FUNCTION__,ret,m_SqlClient.<span style="color: #007788;">GetErrMsg</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> 
<span style="color: #008000;">&#125;</span>   
&nbsp;
MYSQL_RES <span style="color: #000040;">*</span>result <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
ret <span style="color: #000080;">=</span> m_SqlClient.<span style="color: #007788;">Result</span><span style="color: #008000;">&#40;</span>result<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>ret<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>   
    <span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>m_StrErrMsg,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>m_StrErrMsg<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;[%s][%d][%s]Error:[%d][%s]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
            __FILE__,__LINE__,__FUNCTION__,ret,m_SqlClient.<span style="color: #007788;">GetErrMsg</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> 
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #666666;">//这里很重要，做了析构时自动调用mysql_free_result</span>
StCppResult freeRes<span style="color: #008000;">&#40;</span>result<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> unRecords <span style="color: #000080;">=</span> mysql_num_rows<span style="color: #008000;">&#40;</span>result<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span> <span style="color: #000080;">==</span> unRecords<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>   
    <span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>m_StrErrMsg,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>m_StrErrMsg<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;[%s][%d][%s]Error: Result is empty<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
            __FILE__,__LINE__,__FUNCTION__<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>   
MYSQL_ROW row<span style="color: #008080;">;</span>
<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> unIndex <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> unIndex <span style="color: #000080;">&lt;</span> unRecords<span style="color: #008080;">;</span> unIndex<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>   
    row<span style="color: #000080;">=</span>mysql_fetch_row<span style="color: #008000;">&#40;</span>result<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> uin <span style="color: #000080;">=</span> <span style="color: #0000ff;">unsigned</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>row<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    setUins.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>uin<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>   
<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>插入：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>setUins.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>setUins.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">1000</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>m_StrErrMsg,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>m_StrErrMsg<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;[%s][%d][%s]Error:[uins more than 1000]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
            __FILE__,__LINE__,__FUNCTION__<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>   
string strValues<span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> szValue<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>set<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it <span style="color: #000080;">=</span> setUins.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it<span style="color: #000040;">!</span><span style="color: #000080;">=</span>setUins.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #000040;">++</span>it<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>setUins.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> it<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>szValue,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>szValue<span style="color: #008000;">&#41;</span>,TPL_ADDUIN2APP,<span style="color: #000040;">*</span>it,appid<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>       
    <span style="color: #0000ff;">else</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>szValue,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>szValue<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;,&quot;</span>TPL_ADDUIN2APP,<span style="color: #000040;">*</span>it,appid<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    strValues.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>szValue<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">char</span> strSql<span style="color: #008000;">&#91;</span>MAX_QUERYLEN_OPENRIGHT<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>strSql,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>strSql<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;insert into %s(uin,appid) VALUES %s;&quot;</span>,OPENRIGHT_TB_CARE,strValues.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">int</span> ret<span style="color: #008080;">;</span>
ret <span style="color: #000080;">=</span> m_SqlClient.<span style="color: #007788;">Execute</span><span style="color: #008000;">&#40;</span>strSql<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>ret<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>m_StrErrMsg,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>m_StrErrMsg<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;[%s][%d][%s]Error:[%d][%s]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
            __FILE__,__LINE__,__FUNCTION__,ret,m_SqlClient.<span style="color: #007788;">GetErrMsg</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>   
<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>m_SqlClient.<span style="color: #007788;">AffectRows</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">snprintf</span><span style="color: #008000;">&#40;</span>m_StrErrMsg,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>m_StrErrMsg<span style="color: #008000;">&#41;</span>,<span style="color: #FF0000;">&quot;[%s][%d][%s]Error:[%d][%s]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,
            __FILE__,__LINE__,__FUNCTION__,ret,m_SqlClient.<span style="color: #007788;">GetErrMsg</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>OK，就这样。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vimer.cn/2010/10/%e5%85%b3%e4%ba%8emysql_free_result%e5%92%8cmysql_close%e7%9a%84%e8%a7%a3%e6%83%91.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>(总结)mysql中对已存在的表做增/删/改列的相关操作</title>
		<link>http://www.vimer.cn/2010/06/%e6%80%bb%e7%bb%93mysql%e4%b8%ad%e5%af%b9%e5%b7%b2%e5%ad%98%e5%9c%a8%e7%9a%84%e8%a1%a8%e5%81%9a%e5%a2%9e%e5%88%a0%e6%94%b9%e5%88%97%e7%9a%84%e7%9b%b8%e5%85%b3%e6%93%8d%e4%bd%9c.html</link>
		<comments>http://www.vimer.cn/2010/06/%e6%80%bb%e7%bb%93mysql%e4%b8%ad%e5%af%b9%e5%b7%b2%e5%ad%98%e5%9c%a8%e7%9a%84%e8%a1%a8%e5%81%9a%e5%a2%9e%e5%88%a0%e6%94%b9%e5%88%97%e7%9a%84%e7%9b%b8%e5%85%b3%e6%93%8d%e4%bd%9c.html#comments</comments>
		<pubDate>Tue, 29 Jun 2010 10:45:04 +0000</pubDate>
		<dc:creator>Dante</dc:creator>
				<category><![CDATA[MySql]]></category>
		<category><![CDATA[FOREIGN KEY]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.vimer.cn/2010/06/%e6%80%bb%e7%bb%93mysql%e4%b8%ad%e5%af%b9%e5%b7%b2%e5%ad%98%e5%9c%a8%e7%9a%84%e8%a1%a8%e5%81%9a%e5%a2%9e%e5%88%a0%e6%94%b9%e5%88%97%e7%9a%84%e7%9b%b8%e5%85%b3%e6%93%8d%e4%bd%9c.html</guid>
		<description><![CDATA[1.创建列 &#160;&#160;&#160; alter table tablename add colname type not null default '0'; &#160;&#160;&#160; 例： &#160;&#160;&#160; alter table mmanapp_mmanmedia add appid_id integer not null default 372; 2.删除列 &#160;&#160;&#160; alter table t... ]]></description>
			<content:encoded><![CDATA[<p><meta http-equiv="Content-Type" content="text/html; charset=unicode" /><meta content="MSHTML 6.00.6000.17063" name="GENERATOR" /><base href="http://www.vimer.cn" />
<p>1.创建列   <br />&#160;&#160;&#160; alter table tablename add colname type not null default '0';    <br />&#160;&#160;&#160; 例：    <br />&#160;&#160;&#160; alter table mmanapp_mmanmedia add appid_id integer not null default 372;    <br />2.删除列    <br />&#160;&#160;&#160; alter table tablename drop column colname;    <br />&#160;&#160;&#160; 例：    <br />&#160;&#160;&#160; alter table mmanapp_mmanmedia drop column appid_id;</p>
<p>3.在已经存在的列上创建外键关联   <br />&#160;&#160;&#160; ALTER TABLE yourtablename&#160;&#160;&#160; ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)&#160;&#160;&#160; REFERENCES tbl_name (index_col_name, ...)&#160;&#160;&#160; [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]&#160;&#160;&#160; [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]    <br />&#160;&#160;&#160; 例：    <br />&#160;&#160;&#160; ALTER TABLE mmanapp_mmanmedia ADD CONSTRAINT fk_mdappid FOREIGN KEY(appid_id) </p>
<p>4.删除外键关联：   <br />&#160;&#160;&#160; ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol;    <br />&#160;&#160;&#160; 例：    <br />&#160;&#160;&#160; ALTER TABLE mmanapp_mmanmedia DROP FOREIGN KEY fk_mdappid</p>
<p><strong>附文档两份：</strong>    <br />一.mysql对列和表的相关操作    </p>
<p style="border-right: black 1px solid; padding-right: 3px; border-top: black 1px solid; padding-left: 3px; font-size: 12px; margin-left: auto; border-left: black 1px solid; color: black; margin-right: auto; padding-top: 3px; border-bottom: black 1px solid; font-family: courier new; background-color: window; text-align: left; 3px: "><font face="微软雅黑">增加主键     <br /><font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> tabelname <font color="#0000ff"><b>add</b></font> new_field_id <font color="#0000ff"><b>int</b></font>(<font color="#6e00aa">5</font>) unsigned <font color="#0000ff"><b>default</b></font> <font color="#6e00aa">0</font> <font color="#0000ff"><b>not</b></font> <font color="#0000ff"><b>null</b></font> auto_increment ,<font color="#0000ff"><b>add</b></font> <font color="#0000ff"><b>primary</b></font> <font color="#0000ff"><b>key</b></font> (new_field_id);      <br />增加一个新列      <br /><font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> infos <font color="#0000ff"><b>add</b></font> ex tinyint <font color="#0000ff"><b>not</b></font> <font color="#0000ff"><b>null</b></font> <font color="#0000ff"><b>default</b></font> <font color="#ff00bf">'0'</font>;      <br />删除列      <br /><font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> t2 <font color="#0000ff"><b>drop</b></font> <font color="#0000ff"><b>column</b></font> <font color="#0000ff"><b>c</b></font>;      <br />重命名列<font color="#333399">/</font>改变列类型      <br /><font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> t1 change a b <font color="#0000ff"><b>integer</b></font>;      <br /><font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> t1 change b b bigint <font color="#0000ff"><b>not</b></font> <font color="#0000ff"><b>null</b></font>;      <br /><font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> infos change list list tinyint <font color="#0000ff"><b>not</b></font> <font color="#0000ff"><b>null</b></font> <font color="#0000ff"><b>default</b></font> <font color="#ff00bf">'0'</font>;      <br />重命名表      <br /><font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> t1 <font color="#0000ff"><b>rename</b></font> t2;      <br />加索引      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> tablename change depno depno <font color="#0000ff"><b>int</b></font>(<font color="#6e00aa">5</font>) <font color="#0000ff"><b>not</b></font> <font color="#0000ff"><b>null</b></font>;      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> tablename <font color="#0000ff"><b>add</b></font> <font color="#0000ff"><b>index</b></font> 索引名 (字段名<font color="#6e00aa">1</font>[，字段名<font color="#6e00aa">2</font> …]);      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> tablename <font color="#0000ff"><b>add</b></font> <font color="#0000ff"><b>index</b></font> emp_name (<font color="#0000ff"><b>name</b></font>);      <br />加主关键字的索引      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> tablename <font color="#0000ff"><b>add</b></font> <font color="#0000ff"><b>primary</b></font> <font color="#0000ff"><b>key</b></font>(id);      <br />加唯一限制条件的索引      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> tablename <font color="#0000ff"><b>add</b></font> <font color="#0000ff"><b>unique</b></font> emp_name2(cardnumber);      <br />删除某个索引      <br />mysql<font color="#333399">&gt;</font><font color="#0000ff"><b>alter</b></font> <font color="#0000ff"><b>table</b></font> tablename <font color="#0000ff"><b>drop</b></font> <font color="#0000ff"><b>index</b></font> emp_name;</font></p>
<p>二.对表增/删约束关系</p>
<p style="border-right: black 1px solid; padding-right: 3px; border-top: black 1px solid; padding-left: 3px; font-size: 12px; margin-left: auto; border-left: black 1px solid; color: black; margin-right: auto; padding-top: 3px; border-bottom: black 1px solid; font-family: courier new; background-color: window; text-align: left; 3px: "><font face="微软雅黑">InnoDB允许你用<font color="#0000ff"><b>ALTER</b></font> <font color="#0000ff"><b>TABLE</b></font>往一个表中添加一个新的 外键约束：      <br /><font color="#0000ff"><b>ALTER</b></font> <font color="#0000ff"><b>TABLE</b></font> yourtablename      <br />&#160;&#160;&#160; <font color="#0000ff"><b>ADD</b></font> [<font color="#0000ff"><b>CONSTRAINT</b></font> symbol] <font color="#0000ff"><b>FOREIGN</b></font> <font color="#0000ff"><b>KEY</b></font> [id] (index_col_name, ...)      <br />&#160;&#160;&#160; <font color="#0000ff"><b>REFERENCES</b></font> tbl_name (index_col_name, ...)      <br />&#160;&#160;&#160; [<font color="#0000ff"><b>ON</b></font> <font color="#0000ff"><b>DELETE</b></font> {<font color="#0000ff"><b>RESTRICT</b></font> | <font color="#0000ff"><b>CASCADE</b></font> | <font color="#0000ff"><b>SET</b></font> <font color="#0000ff"><b>NULL</b></font> | <font color="#0000ff"><b>NO</b></font> <font color="#0000ff"><b>ACTION</b></font>}]      <br />&#160;&#160;&#160; [<font color="#0000ff"><b>ON</b></font> <font color="#0000ff"><b>UPDATE</b></font> {<font color="#0000ff"><b>RESTRICT</b></font> | <font color="#0000ff"><b>CASCADE</b></font> | <font color="#0000ff"><b>SET</b></font> <font color="#0000ff"><b>NULL</b></font> | <font color="#0000ff"><b>NO</b></font> <font color="#0000ff"><b>ACTION</b></font>}]      <br />记住先创建需要的索引。你也可以用<font color="#0000ff"><b>ALTER</b></font> <font color="#0000ff"><b>TABLE</b></font>往一个表添加一个自引用外键约束。      <br />InnoDB也支持使用<font color="#0000ff"><b>ALTER</b></font> <font color="#0000ff"><b>TABLE</b></font>来移除 外键：      <br /><font color="#0000ff"><b>ALTER</b></font> <font color="#0000ff"><b>TABLE</b></font> yourtablename <font color="#0000ff"><b>DROP</b></font> <font color="#0000ff"><b>FOREIGN</b></font> <font color="#0000ff"><b>KEY</b></font> fk_symbol;      <br />当年创建一个外键之时，如果<font color="#0000ff"><b>FOREIGN</b></font> <font color="#0000ff"><b>KEY</b></font>子句包括一个<font color="#0000ff"><b>CONSTRAINT</b></font>名字，你可以引用那个名字来移除 外键。另外，当外键被创建之时，fk_symbol值被InnoDB内部保证。当你想要移除一个外键之时，要找出标记，请使用<font color="#0000ff"><b>SHOW</b></font> <font color="#0000ff"><b>CREATE</b></font> <font color="#0000ff"><b>TABLE</b></font>语句。例子如下：      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>SHOW</b></font> <font color="#0000ff"><b>CREATE</b></font> <font color="#0000ff"><b>TABLE</b></font> ibtest11c\<font color="#0000ff"><b>G</b></font>      <br /><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font> <font color="#6e00aa">1</font>. <font color="#0000ff"><b>row</b></font> <font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font><font color="#333399">*</font>      <br />&#160;&#160;&#160;&#160;&#160;&#160; <font color="#0000ff"><b>Table</b></font>: ibtest11c      <br /><font color="#0000ff"><b>Create</b></font> <font color="#0000ff"><b>Table</b></font>: <font color="#0000ff"><b>CREATE</b></font> <font color="#0000ff"><b>TABLE</b></font> `ibtest11c` (      <br />&#160; `A` <font color="#0000ff"><b>int</b></font>(<font color="#6e00aa">11</font>) <font color="#0000ff"><b>NOT</b></font> <font color="#0000ff"><b>NULL</b></font> auto_increment,      <br />&#160; `D` <font color="#0000ff"><b>int</b></font>(<font color="#6e00aa">11</font>) <font color="#0000ff"><b>NOT</b></font> <font color="#0000ff"><b>NULL</b></font> <font color="#0000ff"><b>default</b></font> <font color="#ff00bf">'0'</font>,      <br />&#160; `B` <font color="#0000ff"><b>varchar</b></font>(<font color="#6e00aa">200</font>) <font color="#0000ff"><b>NOT</b></font> <font color="#0000ff"><b>NULL</b></font> <font color="#0000ff"><b>default</b></font> <font color="#ff00bf">''</font>,      <br />&#160; `<font color="#0000ff"><b>C</b></font>` <font color="#0000ff"><b>varchar</b></font>(<font color="#6e00aa">175</font>) <font color="#0000ff"><b>default</b></font> <font color="#0000ff"><b>NULL</b></font>,      <br />&#160; <font color="#0000ff"><b>PRIMARY</b></font> <font color="#0000ff"><b>KEY</b></font>&#160; (`A`,`D`,`B`),      <br />&#160; <font color="#0000ff"><b>KEY</b></font> `B` (`B`,`<font color="#0000ff"><b>C</b></font>`),      <br />&#160; <font color="#0000ff"><b>KEY</b></font> `<font color="#0000ff"><b>C</b></font>` (`<font color="#0000ff"><b>C</b></font>`),      <br />&#160; <font color="#0000ff"><b>CONSTRAINT</b></font> `0_38775` <font color="#0000ff"><b>FOREIGN</b></font> <font color="#0000ff"><b>KEY</b></font> (`A`, `D`)      <br /><font color="#0000ff"><b>REFERENCES</b></font> `ibtest11a` (`A`, `D`)      <br /><font color="#0000ff"><b>ON</b></font> <font color="#0000ff"><b>DELETE</b></font> <font color="#0000ff"><b>CASCADE</b></font> <font color="#0000ff"><b>ON</b></font> <font color="#0000ff"><b>UPDATE</b></font> <font color="#0000ff"><b>CASCADE</b></font>,      <br />&#160; <font color="#0000ff"><b>CONSTRAINT</b></font> `0_38776` <font color="#0000ff"><b>FOREIGN</b></font> <font color="#0000ff"><b>KEY</b></font> (`B`, `<font color="#0000ff"><b>C</b></font>`)      <br /><font color="#0000ff"><b>REFERENCES</b></font> `ibtest11a` (`B`, `<font color="#0000ff"><b>C</b></font>`)      <br /><font color="#0000ff"><b>ON</b></font> <font color="#0000ff"><b>DELETE</b></font> <font color="#0000ff"><b>CASCADE</b></font> <font color="#0000ff"><b>ON</b></font> <font color="#0000ff"><b>UPDATE</b></font> <font color="#0000ff"><b>CASCADE</b></font>      <br />) ENGINE<font color="#333399">=</font>INNODB CHARSET<font color="#333399">=</font>latin1      <br /><font color="#6e00aa">1</font> <font color="#0000ff"><b>row</b></font> <font color="#0000ff"><b>in</b></font> <font color="#0000ff"><b>set</b></font> (<font color="#6e00aa">0</font>.<font color="#6e00aa">01</font> sec)      <br />&#160; <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>ALTER</b></font> <font color="#0000ff"><b>TABLE</b></font> ibtest11c <font color="#0000ff"><b>DROP</b></font> <font color="#0000ff"><b>FOREIGN</b></font> <font color="#0000ff"><b>KEY</b></font> 0_38775;      <br />InnoDB解析程序允许你在<font color="#0000ff"><b>FOREIGN</b></font> <font color="#0000ff"><b>KEY</b></font> ... <font color="#0000ff"><b>REFERENCES</b></font> ...子句中用`（backticks)把表和列名名字围起来。InnoDB解析程序也考虑到lower_case_table_names系统变量的设置。      <br />InnoDB返回一个表的外键定义作为<font color="#0000ff"><b>SHOW</b></font> <font color="#0000ff"><b>CREATE</b></font> <font color="#0000ff"><b>TABLE</b></font>语句输出的一部分：      <br /><font color="#0000ff"><b>SHOW</b></font> <font color="#0000ff"><b>CREATE</b></font> <font color="#0000ff"><b>TABLE</b></font> tbl_name;      <br />从这个版本起，mysqldump也将表的正确定义生成到转储文件中，且并不忘记 外键。      <br />你可以如下对一个表显示外键约束：      <br /><font color="#0000ff"><b>SHOW</b></font> <font color="#0000ff"><b>TABLE</b></font> STATUS <font color="#0000ff"><b>FROM</b></font> db_name <font color="#0000ff"><b>LIKE</b></font> <font color="#ff00bf">'tbl_name'</font>;      <br />外键约束被列在输出的<font color="#0000ff"><b>Comment</b></font>列。      <br />当执行外键检查之时，InnoDB对它照看着的子或父记录设置共享的行级锁。InnoDB立即检查外键约束，检查不对事务提交延迟。      <br />要使得对有外键关系的表重新载入转储文件变得更容易，mysqldump自动在转储输出中包括一个语句设置FOREIGN_KEY_CHECKS为<font color="#6e00aa">0</font>。这避免在转储被重新装载之时，与不得不被以特别顺序重新装载的表相关的问题。也可以手动设置这个变量：      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>SET</b></font> FOREIGN_KEY_CHECKS <font color="#333399">=</font> <font color="#6e00aa">0</font>;      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>SOURCE</b></font> dump_file_name;      <br />mysql<font color="#333399">&gt;</font> <font color="#0000ff"><b>SET</b></font> FOREIGN_KEY_CHECKS <font color="#333399">=</font> <font color="#6e00aa">1</font>;      <br />如果转储文件包含对外键是不正确顺序的表，这就以任何顺序导入该表。这样也加快导入操作。设置FOREIGN_KEY_CHECKS为<font color="#6e00aa">0</font>，对于在<font color="#0000ff"><b>LOAD</b></font> <font color="#0000ff"><b>DATA</b></font>和<font color="#0000ff"><b>ALTER</b></font> <font color="#0000ff"><b>TABLE</b></font>操作中忽略外键限制也是非常有用的。      <br />InnoDB不允许你删除一个被<font color="#0000ff"><b>FOREIGN</b></font> <font color="#0000ff"><b>KEY</b></font>表约束 引用的表，除非你做设置<font color="#0000ff"><b>SET</b></font> FOREIGN_KEY_CHECKS<font color="#333399">=</font><font color="#6e00aa">0</font>。当你移除一个表的时候，在它的创建语句里定义的约束也被移除。      <br />如果你重新创建一个被移除的表，它必须有一个遵从于也引用它的外键约束的定义。它必须有正确的列名和类型，并且如前所述，它必须对被 引用的键有索引。如果这些不被满足，MySQL返回错误号<font color="#6e00aa">1005</font> 并在错误信息字符串中指向errno <font color="#6e00aa">150</font>。</font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vimer.cn/2010/06/%e6%80%bb%e7%bb%93mysql%e4%b8%ad%e5%af%b9%e5%b7%b2%e5%ad%98%e5%9c%a8%e7%9a%84%e8%a1%a8%e5%81%9a%e5%a2%9e%e5%88%a0%e6%94%b9%e5%88%97%e7%9a%84%e7%9b%b8%e5%85%b3%e6%93%8d%e4%bd%9c.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>mysql的几个常用命令（比较简单）</title>
		<link>http://www.vimer.cn/2009/12/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4%ef%bc%88%e6%af%94%e8%be%83%e7%ae%80%e5%8d%95%ef%bc%89.html</link>
		<comments>http://www.vimer.cn/2009/12/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4%ef%bc%88%e6%af%94%e8%be%83%e7%ae%80%e5%8d%95%ef%bc%89.html#comments</comments>
		<pubDate>Wed, 23 Dec 2009 09:44:02 +0000</pubDate>
		<dc:creator>Dante</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.vimer.cn/?p=639</guid>
		<description><![CDATA[以下是我这几天一直在用的几个命令，先记下来，以后会整理一份mysql详细的使用文档 注:[]中代表名字，需要用库名或者表名替换 显示所有的库: show databases; 进入某库: use [dbname]; 显示所有的表... ]]></description>
			<content:encoded><![CDATA[<p>以下是我这几天一直在用的几个命令，先记下来，以后会整理一份mysql详细的使用文档<br />
注:[]中代表名字，需要用库名或者表名替换<br />
显示所有的库:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;"><span style="color: #0000ff;"><strong>show</strong></span> databases;</span></p>
<p>进入某库:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;">use [dbname];</span></p>
<p>显示所有的表:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;"><span style="color: #0000ff;"><strong>show</strong></span> tables;</span></p>
<p>显示某表的字段配置:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;"><span style="color: #0000ff;"><strong>describe</strong></span> [tbname];<br />
或<br />
<span style="color: #0000ff;"><strong>show</strong></span> <span style="color: #0000ff;"><strong>full</strong></span> fields <span style="color: #0000ff;"><strong>from</strong></span> [tbname];</span></p>
<p>创建库:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;"><span style="color: #0000ff;"><strong>create</strong></span> <span style="color: #0000ff;"><strong>database</strong></span> [dbname];</span></p>
<p>删除表:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;"><span style="color: #0000ff;"><strong>drop</strong></span> <span style="color: #0000ff;"><strong>database</strong></span> [dbname];</span></p>
<p>删除表:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;"><span style="color: #0000ff;"><strong>drop</strong></span> <span style="color: #0000ff;"><strong>table</strong></span> [tbname];</span></p>
<p>导入创建脚本:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;">mysql <span style="color: #333399;">-</span>u[<span style="color: #0000ff;"><strong>user</strong></span>] <span style="color: #333399;">-</span>p [dbname] <span style="color: #333399;">&lt;</span> [<span style="color: #0000ff;"><strong>create</strong></span>.<span style="color: #0000ff;"><strong>sql</strong></span>] (如果没有密码，则不需要<span style="color: #333399;">-</span>p)</span></p>
<p>显示每个表的数据存储量等状态:</p>
<p style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: black 1px solid; PADDING-LEFT: 3px; FONT-SIZE: 12px; MARGIN-LEFT: auto; BORDER-LEFT: black 1px solid; COLOR: black; MARGIN-RIGHT: auto; PADDING-TOP: 3px; BORDER-BOTTOM: black 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: window; TEXT-ALIGN: left; 3px: "><span style="font-family: 微软雅黑;"><span style="color: #0000ff;"><strong>show</strong></span> <span style="color: #0000ff;"><strong>table</strong></span> status \<span style="color: #0000ff;"><strong>G</strong></span>;</span></p>
<p> 就到这里。</p>
<p>转载请注明出处.<a href="http://www.vimer.cn">http://www.vimer.cn</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vimer.cn/2009/12/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4%ef%bc%88%e6%af%94%e8%be%83%e7%ae%80%e5%8d%95%ef%bc%89.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

