<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[忆风居]]></title> 
<link>http://yfyfj.cn/index.php</link> 
<description><![CDATA[忆风的地盘，一些日常的记忆，技术文摘，以及收集的一些文章。]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[忆风居]]></copyright>
<item>
<link>http://yfyfj.cn/post/mysql_optimizer.php</link>
<title><![CDATA[MYSQL的优化[转]]]></title> 
<author>yfyfj &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Thu, 05 Aug 2010 02:45:31 +0000</pubDate> 
<guid>http://yfyfj.cn/post/mysql_optimizer.php</guid> 
<description>
<![CDATA[ 
	1.数据库的设计<br />尽量把数据库设计的更小的占磁盘空间.<br />1).尽可能使用更小的整数类型.(mediumint就比int更合适).<br />2).尽可能的定义字段为not null,除非这个字段需要null.（<span style="color: #ff0102">这个规则只适合字段为KEY的情形</span>）<br />3).如果没有用到变长字段的话比如varchar,那就采用固定大小的纪录格式比如char.（CHAR 总是比VARCHR快）<br />4).表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效.<br />5).只创建确实需要的索引。索引有利于检索记录，但是不利于快速保存记录。如果总是要在表的组合字段上做搜索，那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是需要用到很多字段，首先就应该多复制这些字段，使索引更好的压缩。<br /><span style="color: #ff0102">（这条只适合MYISAM引擎的表，对于INNODB则在保存记录的时候关系不大，因为INNODB是以事务为基础的，如果想快速保存记录的话，特别是大批量的导入记录的时候</span>）<br />6).所有数据都得在保存到数据库前进行处理。<br />7).所有字段都得有默认值。<br />8).在某些情况下,把一个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以取得相关记录时，它可能使用更小的静态格式表的情况下更是如此。 <br />(<span style="color: #ff0102">具体的表现为：MYISAM表的MERGE类型，以及MYISAM和INNODB通用的分区，详情见手册</span>)<br />9).不会用到外键约束的地方尽量不要使用外键。<br />2.系统的用途<br />1).及时的关闭对MYSQL的连接。<br />2).explain 复杂的SQL语句。（<span style="color: #ff0102">这样能确定你的SELECT 语句怎么优化最佳</span>）<br />3).如果两个关联表要做比较话，做比较的字段必须类型和长度都一致.（<span style="color: #ff0102">在数据庞大的时候建立INDEX</span>）<br />4).LIMIT语句尽量要跟order by或者 distinct.这样可以避免做一次full table scan.<br />5).如果想要清空表的所有纪录,建议用truncate table tablename而不是delete from tablename.<br />不过有一个问题，truncate 不会在事务处理中回滚。因为她要调用create table 语句。<br />（<span style="color: #ff0102">Truncate Table 语句先删除表然后再重建，这个是属于文件级别的，所以自然快N多</span>）<br /><span style="color: #cc3333">实测例子：</span><br /><span style="color: #cc3333">song2为INNODB表。</span><br /><span style="color: #cc3333">mysql&gt; select count(1) from song2;</span><br /><span style="color: #cc3333">+----------+</span><br /><span style="color: #cc3333">&#124; count(1) &#124;</span><br /><span style="color: #cc3333">+----------+</span><br /><span style="color: #cc3333">&#124;&nbsp;&nbsp; 500000 &#124;</span><br /><span style="color: #cc3333">+----------+</span><br /><span style="color: #cc3333">1 row in set (0.91 sec)</span><br /><br /><span style="color: #cc3333">mysql&gt; delete from song2;</span><br /><span style="color: #cc3333">Query OK, 500000 rows affected (15.70 sec)</span><br /><span style="color: #cc3333">mysql&gt; truncate table song2;</span><br /><span style="color: #cc3333">Query OK, 502238 rows affected (0.17 sec)</span><br /><br />6).能使用STORE PROCEDURE 或者 USER FUNCTION的时候.（<span style="color: #ff0102">ROUTINE总是减少了服务器端的开销</span>）<br />7).在一条insert语句中采用多重纪录插入格式.而且使用load data infile来导入大量数据，这比单纯的indert快好多.（<span style="color: #ff0102">在MYSQL中具体表现为：INSERT INTO TABLEQ VALUES (),(),...();</span>）<br />（<span style="color: #ff0102">还有就是在MYISAM表中插入大量记录的时候先禁用到KEYS后面再建立KEYS,具体表现语句：</span><br /><span style="color: #ff0102">&nbsp;ALTER TABLE TABLE1 DISABLE KEYS;ALTER TABLE TABLE1 ENABLE KEYS;</span><br /><span style="color: #ff0102">而对于INNNODB 表在插入前先 set autocommit=0;完了后：set autocommit=1;这样效率比较高。</span>）<br />8).经常OPTIMIZE TABLE 来整理碎片.<br />9).还有就是date 类型的数据如果频繁要做比较的话尽量保存在unsigned int 类型比较快。<br />3.系统的瓶颈<br />1).磁盘搜索.<br />并行搜索,把数据分开存放到多个磁盘中，这样能加快搜索时间.<br />2).磁盘读写(IO)<br />可以从多个媒介中并行的读取数据。<br />3).CPU周期<br />数据存放在主内存中.这样就得增加CPU的个数来处理这些数据。<br />4).内存带宽<br />当CPU要将更多的数据存放到CPU的缓存中来的话,内存的带宽就成了瓶颈.
]]>
</description>
</item><item>
<link>http://yfyfj.cn/post/mysql_errno_1067.php</link>
<title><![CDATA[Xampp里Mysql服务启动不起来，错误1067]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Wed, 06 Jan 2010 06:48:56 +0000</pubDate> 
<guid>http://yfyfj.cn/post/mysql_errno_1067.php</guid> 
<description>
<![CDATA[ 
	在XAMPP里MYSQL以服务方式启动失败，提示错误是 1067 进程意外终止<br /><br />解决方法：<br /><br />1、 进入 xampp安装目录<br /><br />2、进入mysql&#92;bin&#92;目录， 打开my.ini ， 修改<br /><br />[mysqld]<br />port= 3306<br />socket= &quot;/xampp/mysql/mysql.sock&quot;<br />basedir=&quot;/xampp/mysql&quot; <br />tmpdir=&quot;/xampp/tmp&quot; <br />datadir=&quot;/xampp/mysql/data&quot;<br /><br /><br />把路径补全，比如xampp安装在d盘根目录，那么修改为<br /><br />[mysqld]<br />port= 3306<br />socket= &quot;d:/xampp/mysql/mysql.sock&quot;<br />basedir=&quot;d:/xampp/mysql&quot; <br />tmpdir=&quot;d:/xampp/tmp&quot; <br />datadir=&quot;d:/xampp/mysql/data&quot;<br /><br />3、 重启mysql，搞定<br /><br /><br /><br />BTW: xampp1.7.3 在Windows7下面Apache启动不了, 是apache里加载perl模块的缘故， 只要在httpd.conf里去掉 加载 perl 模块就行了<br/>Tags - <a href="http://yfyfj.cn/go.php/tags/xampp/" rel="tag">xampp</a> , <a href="http://yfyfj.cn/go.php/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/116.htm</link>
<title><![CDATA[mysql 中替换字段中的值]]></title> 
<author>yfyfj &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Fri, 07 Aug 2009 07:43:19 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/116.htm</guid> 
<description>
<![CDATA[ 
	<p>UPDATE `it_addonarticle` <br />SET `body` = REPLACE(`body`, 'it.djoooo.cn', 'www.itlong.com.cn') <br />WHERE INSTR(`body`,'it.djoooo.cn') &gt; 0</p><p><br />UPDATE `it_archives` <br />SET `litpic` = REPLACE(`litpic`, 'it.djoooo.cn', 'www.itlong.com.cn') <br />WHERE INSTR(`litpic`,'it.djoooo.cn') &gt; 0</p><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/%25E6%259B%25BF%25E6%258D%25A2mysql%25E5%25AD%2597%25E6%25AE%25B5%25E5%2586%2585%25E5%25AE%25B9/" rel="tag">替换mysql字段内容</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/73.htm</link>
<title><![CDATA[解决Can’t connect to MySQL server on ‘localhost’ (10048),]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Fri, 14 Nov 2008 02:16:06 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/73.htm</guid> 
<description>
<![CDATA[ 
	<p>解决Can&rsquo;t connect to MySQL server on &lsquo;localhost&rsquo; (10048), 一般见于使用mysql的windows 2003服务器.</p><p>错误的出现的原因:</p><p>应用程序需要快速释放和创建新连接, 但是由于 TIME_WAIT 中存在的连接超过默认值，导致较低吞吐量.</p><p>解决方案:<br />和本错误密切相关的两个windows的注册表项:TcpTimedWaitDelay和MaxUserPort的值.<br />TcpTimedWaitDelay 确定 TCP/IP 可释放已关闭连接并重用其资源前, 必须经过的时间. 关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期（2MSL）状态. 此时间期间, 重新打开到客户机和服务器的连接的成本少于建立新连接. 减少此条目的值允许 TCP/IP 更快地释放已关闭的连接, 为新连接提供更多资源.</p><p>MaxUserPort 确定从系统请求任何可用用户端口时所用最大端口数，TCP/IP 可指定的最高端口号. 如果建立 TCP 连接最大端口连接大于 5000, 本地计算机响应以下错误信息WSAENOBUFS (10055): 因为系统缺乏足够缓冲区或者因为队列已满而无法执行套接字上操作, 从而导致应用程序的10048错误.</p><p>打开注册表编辑器regedit</p><p>TcpTimedWaitDelay 设置:<br />找到 HKEY_LOCAL_MACHINE&#92;SYSTEM&#92;CurrentControlSet&#92; Services&#92;TCPIP&#92;Parameters 注册表子键<br />并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值<br />设置此值为十进制 30, 十六进制为 0&times;0000001e<br />该值等待时间将是 30 秒。<br />本项的默认值：0xF0(16进制), 等待时间设置为 240 秒</p><p>MaxUserPort 设置(增加最大值端口连接):<br />找到 HKEY_LOCAL_MACHINE&#92;SYSTEM&#92;CurrentControlSet&#92; Services&#92;TCPIP&#92;Parameters 注册表子键<br />并创建名为 MaxUserPort 的新 REG_DWORD 值<br />设置此值为十进制最低 32768<br />该值等待时间将是 30 秒。<br />重启windows系统。<br />本项的默认值：5000(十进制)</p><p>关闭注册表编辑器, 重启windows系统。</p><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://yfyfj.cn/go.php/tags/10048/" rel="tag">10048</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/66.htm</link>
<title><![CDATA[修复Cannot open *.MYI 数据库方法]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Wed, 08 Oct 2008 07:12:25 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/66.htm</guid> 
<description>
<![CDATA[ 
	<p>mysql数据库如果遭受到意外断电的话，很容易造成数据表损坏，那么一般修复步骤如下：<br /><br />假设sometable 为坏的那个表<br />1、 直接 repair table sometable;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果rp好的话，就直接修复好了。如果还是不行呢. 看第2个步骤<br /><br /><br />2、 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1 停止mysql数据库，&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.2 运行myisamchk -r &quot;d:&#92;mysql&#92;data&#92;databasea&#92;sometable.MYI&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.3&nbsp;启动数据库 运行&nbsp;repair table sometable<br /><br />大部分的数据表坏掉，都能修复的， 如果实在不行，那就只能去恢复以前的备份了！<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://yfyfj.cn/go.php/tags/%25E6%2581%25A2%25E5%25A4%258D%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593/" rel="tag">恢复数据库</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/22.htm</link>
<title><![CDATA[ MySQL触发器简介]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Wed, 18 Jun 2008 10:04:11 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/22.htm</guid> 
<description>
<![CDATA[ 
	<strong>为什么要用触发器<br /><br /></strong>我们在MySQL 5.0中包含对触发器的支持是由于以下原因: <pre>MySQL早期版本的用户长期有需要触发器的要求。 我们曾经许诺支持所有ANSI标准的特性。 您可以使用它来检查或预防坏的数据进入数据库。 您可以改变或者取消INSERT, UPDATE以及DELETE语句。 您可以在一个会话中监视数据改变的动作。</pre>在这里我假定大家都读过&quot;MySQL新特性&quot;丛书的第一集--&quot;MySQL存储过程&quot;，那么大家都应该知道MySQL至此存储过程和函数，那是很重要的知识，因为在触发器中你可以使用在函数中使用的语句。特别举个例子： <pre>复合语句(BEGIN / END)是合法的. 流控制（Flow-of-control）语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的. 变量声明(DECLARE)以及指派(SET)是合法的. 允许条件声明. 异常处理声明也是允许的. 但是在这里要记住函数有受限条件:不能在函数中访问表.&nbsp;&nbsp;因此在函数中使用以下语句是非法的。 ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL LOCK OPTIMIZE REPAIR REPLACE REVOKE ROLLBACK SAVEPOINT 'SELECT FROM table' 'SET system variable' 'SET TRANSACTION' SHOW 'START TRANSACTION' TRUNCATE UPDATE&nbsp;&nbsp;在触发器中也有完全一样的限制.</pre>触发器相对而言比较新，因此会有（bugs）缺陷.所以我在这里给大家警告，就像我在存储过程书中所说那样.不要在含有重要数据的数据库中使用这个触发器，如果需要的话在一些以测试为目的的数据库上使用，同时在你对表创建触发器时确认这些数据库是默认的。<br /><br /><strong>语法</strong> <pre>1. 语法：命名规则&nbsp;&nbsp;CREATE TRIGGER &lt;触发器名称&gt; &lt;-- &#123; BEFORE &#124; AFTER &#125; &#123; INSERT &#124; UPDATE &#124; DELETE &#125; ON &lt;表名称&gt; FOR EACH ROW &lt;触发器SQL语句&gt; </pre>触发器必须有名字，最多64个字符，可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.<br /><br />这里我有个习惯：就是用表的名字＋'_'＋触发器类型的缩写.因此如果是表t26，触发器是在事件UPDATE（参考下面的点（2）和（3））之前（BEFORE）的，那么它的名字就是t26_bu。 <pre>2. 语法：触发时间&nbsp;&nbsp;CREATE TRIGGER &lt;触发器名称&gt; &#123; BEFORE &#124; AFTER &#125; &lt;-- &#123; INSERT &#124; UPDATE &#124; DELETE &#125; ON &lt;表名称&gt; FOR EACH ROW &lt;触发的SQL语句&gt;&nbsp;&nbsp;触发器有执行的时间设置：可以设置为事件发生前或后。&nbsp;&nbsp;3. 语法：事件&nbsp;&nbsp;CREATE TRIGGER &lt;触发器名称&gt; &#123; BEFORE &#124; AFTER &#125; &#123; INSERT &#124; UPDATE &#124; DELETE &#125; &lt;-- ON &lt;表名称&gt; FOR EACH ROW &lt;触发的SQL语句&gt;&nbsp;&nbsp;同样也能设定触发的事件：它们可以在执行insert、update或delete的过程中触发。 4. 语法：表&nbsp;&nbsp;CREATE TRIGGER &lt;触发器名称&gt; &#123; BEFORE &#124; AFTER &#125; &#123; INSERT &#124; UPDATE &#124; DELETE &#125; ON &lt;表名称&gt; &lt;-- FOR EACH ROW &lt;触发的SQL语句&gt;&nbsp;&nbsp;触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。&nbsp;&nbsp;5. 语法：（ 步长）触发间隔&nbsp;&nbsp;CREATE TRIGGER &lt;触发器名称&gt; &#123; BEFORE &#124; AFTER &#125; &#123; INSERT &#124; UPDATE &#124; DELETE &#125; ON &lt;表名称&gt; FOR EACH ROW &lt;-- &lt;触发的SQL语句&gt;&nbsp;&nbsp;触发器的执行间隔：FOR EACH ROW子句通知触发器 每隔一行执行一次动作，而不是对整个表执行一次。&nbsp;&nbsp;6. 语法：语句&nbsp;&nbsp;CREATE TRIGGER &lt;触发器名称&gt; &#123; BEFORE &#124; AFTER &#125; &#123; INSERT &#124; UPDATE &#124; DELETE &#125; ON &lt;表名称&gt; FOR EACH ROW &lt;触发的SQL语句&gt; &lt;--&nbsp;&nbsp;触发器包含所要触发的SQL语句：这里的语句可以是任何合法的语句， 包括复合语句，但是这里的语句受的限制和函数的一样。 Privileges权限&nbsp;&nbsp;你必须拥有相当大的权限才能创建触发器（CREATE TRIGGER）。 如果你已经是Root用户，那么就足够了。这跟SQL的标准有所不同。&nbsp;&nbsp;因此在下一个版本的MySQL中， 你完全有可能看到有一种叫做CREATE TRIGGER的新权限。 然后通过这样的方法赋予： GRANT CREATE TRIGGER ON &lt;表名称&gt; TO &lt;用户或用户列表&gt;; 也可以通过这样收回权限： REVOKE CREATE TRIGGER ON &lt;表名称&gt; FROM &lt;用户或用户列表&gt;; </pre><strong>关于旧的和新创建的列的标识</strong><br /><br />在触发器的SQL语句中，你可以关联表中的任意列。但你不能仅使用列的名称去标识，那会使系统混淆，因为那里可能会有列的新名（这可能正是你要修改的，你的动作可能正是要修改列名），还有列的旧名存在。因此你必须用这样的语法来标识： &quot;NEW . column_name&quot;或者&quot;OLD . column_name&quot;.这样在技术上处理（NEW &#124; OLD . column_name）新和旧的列名属于创建了过渡变量（&quot;transition variables&quot;）。 <br /><br />对于INSERT语句,只有NEW是合法的；对于DELETE语句，只有OLD才合法；而UPDATE语句可以在和NEW以及OLD同时使用。下面是一个UPDATE中同时使用NEW和OLD的例子。 <pre>CREATE TRIGGER t21_au BEFORE UPDATE ON t22 FOR EACH ROW BEGIN SET @old = OLD . s1; SET @new = NEW.s1; END;//&nbsp;&nbsp;现在如果t21表中的s1列的值是55，那么执行了 &quot;UPDATE t21 SET s1 = s1 + 1&quot;之后@old的值会变成55， 而@new的值将会变成56。</pre><pre>Example of CREATE and INSERT CREATE和INSERT的例子 创建有触发器的表 这里所有的例程中我都假定大家的分隔符已经设置成//（DELIMITER //）。 CREATE TABLE t22 (s1 INTEGER)// CREATE TRIGGER t22_bi BEFORE INSERT ON t22 FOR EACH ROW BEGIN SET @x = 'Trigger was activated!'; SET NEW.s1 = 55; END;// </pre>在最开始我创建了一个名字为t22的表，然后在表t22上创建了一个触发器t22_bi，当我们要向表中的行插入时，触发器就会被激活，执行将s1列的值改为55的动作。<br /><br />使用触发器执行插入动作 <br /><br />mysql&gt; INSERT INTO t22 VALUES (1)//<br /><br />让我们看如果向表t2中插入一行数据触发器对应的表会怎么样？ 这里的插入的动作是很常见的，我们不需要触发器的权限来执行它。甚至不需要知道是否有触发器关联。 <pre>mysql&gt; SELECT @x, t22.* FROM t22// +------------------------+------+ &#124; @x &#124; s1 &#124; +------------------------+------+ &#124; Trigger was activated! &#124; 55 &#124; +------------------------+------+ 1 row in set (0.00 sec) </pre>大家可以看到INSERT动作之后的结果，和我们预期的一样，x标记被改动了，同时这里插入的数据不是我们开始输入的插入数据，而是触发器自己的数据。 <pre>&quot;check&quot;完整性约束例子 什么是&quot;check&quot;约束 在标准的SQL语言中，我们可以在（CREATE TABLE）创建表的过程中使用&quot;CHECK (condition)&quot;， 例如： CREATE TABLE t25 (s1 INT, s2 CHAR(5), PRIMARY KEY (s1), CHECK (LEFT(s2,1)='A')) ENGINE=INNODB; </pre>这里CHECK的意思是&quot;当s2列的最左边的字符不是'A'时，insert和update语句都会非法&quot;，MySQL的视图不支持CHECK，我个人是很希望它能支持的。但如果你很需要在表中使用这样的功能，我建议大家使用触发器来实现。 <pre>CREATE TABLE t25 (s1 INT, s2 CHAR(5), PRIMARY KEY (s1)) ENGINE=INNODB//&nbsp;&nbsp;CREATE TRIGGER t25_bi BEFORE INSERT ON t25 FOR EACH ROW IF LEFT(NEW.s2,1)&lt;&gt;'A' THEN SET NEW.s1=0; END IF;//&nbsp;&nbsp;CREATE TRIGGER t25_bu BEFORE UPDATE ON t25 FOR EACH ROW IF LEFT(NEW.s2,1)&lt;&gt;'A' THEN SET NEW.s1=0; END IF;// </pre>我只需要使用BEFORE INSERT和BEFORE UPDATE语句就行了，删除了触发器不会对表有影响，同时AFTER的触发器也不能修改NEW的过程变量（transition variables）。为了激活触发器，我执行了向表中的行插入s1＝0的数据，之后只要执行符合LEFT(s2,1) &lt;&gt; 'A'条件的动作都会失败： <pre>INSERT INTO t25 VALUES (0,'a') /* priming the pump */ // INSERT INTO t25 VALUES (5,'b') /* gets error '23000' */ // Don't Believe The Old MySQL Manual</pre><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://yfyfj.cn/go.php/tags/%25E8%25A7%25A6%25E5%258F%2591%25E5%2599%25A8/" rel="tag">触发器</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/21.htm</link>
<title><![CDATA[mysql存储过程学习总结]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Wed, 18 Jun 2008 10:03:14 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/21.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-weight: bold">一.创建存储过程</span><br /><div style="margin-left: 40px">1.基本语法：<br /><div style="margin-left: 40px">create procedure sp_name()<br />begin<br />.........<br />end<br /></div>2.参数传递<br /></div><span style="font-weight: bold">二.调用存储过程</span><br /><div style="margin-left: 40px">1.基本语法：call sp_name()<br />注意：存储过程名称后面必须加括号，哪怕该存储过程没有参数传递<br /></div><span style="font-weight: bold">三.删除存储过程</span><br /><div style="margin-left: 40px">1.基本语法：<br />drop procedure sp_name//<br />2.注意事项<br />(1)不能在一个存储过程中删除另一个存储过程，只能调用另一个存储过程<br /></div><span style="font-weight: bold">四.区块，条件，循环<br /></span><div style="margin-left: 40px">1.区块定义，常用<br />begin<br />......<br />end;<br />也可以给区块起别名，如：<br />lable:begin<br />...........<br />end lable;<br />可以用leave lable;跳出区块，执行区块以后的代码<br />2.条件语句<br /><div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; width: 95%; padding-top: 4px; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial; border: windowtext 0.5pt solid"><div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;条件&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" />statement<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /></span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" />statement<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /></span><span style="color: #0000ff">end</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">;</span></div></div><br />3.循环语句<br />(1).while循环<br /><div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; width: 95%; padding-top: 4px; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial; border: windowtext 0.5pt solid"><div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><span style="color: #ff0000">[</span><span style="color: #ff0000">label:</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">WHILE</span><span style="color: #000000">&nbsp;expression&nbsp;DO<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" />statements<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /></span><span style="color: #0000ff">END</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">WHILE</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">label</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /></span></div></div><br /></div><div style="margin-left: 40px">(2).loop循环<br /><div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; width: 95%; padding-top: 4px; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial; border: windowtext 0.5pt solid"><div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><span style="color: #ff0000">[</span><span style="color: #ff0000">label:</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;LOOP<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" />statements<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /></span><span style="color: #0000ff">END</span><span style="color: #000000">&nbsp;LOOP&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">label</span><span style="color: #ff0000">]</span><span style="color: #000000">;</span></div></div><br /></div><div style="margin-left: 40px">(3).repeat until循环<br /><div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; width: 95%; padding-top: 4px; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial; border: windowtext 0.5pt solid"><div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><span style="color: #ff0000">[</span><span style="color: #ff0000">label:</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;REPEAT<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" />statements<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" />UNTIL&nbsp;expression<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" border="0" width="11" height="16" align="top" /></span><span style="color: #0000ff">END</span><span style="color: #000000">&nbsp;REPEAT&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">label</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;;</span></div></div><br /></div><span style="font-weight: bold">五.其他常用命令</span><br /><div style="margin-left: 40px">1.show procedure status<br />显示数据库中所有存储的存储过程基本信息，包括所属数据库，存储过程名称，创建时间等<br />2.show create procedure sp_name<br />显示某一个存储过程的详细信息</div><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/mysql/" rel="tag">mysql</a> , <a href="http://yfyfj.cn/go.php/tags/%25E5%25AD%2598%25E5%2582%25A8%25E8%25BF%2587%25E7%25A8%258B/" rel="tag">存储过程</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/3.htm</link>
<title><![CDATA[MySQL5.0 不能使用自动增加字段问题解决 ]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Mysql]]></category>
<pubDate>Tue, 20 May 2008 01:50:16 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/3.htm</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;引起的原因是在mysql5.0.2版本中的The Server SQL Mode 中新加了几种 sql_mode,并且在sql的my.ini文件中的sql-mode 默认增加了其中的二种,一个是STRICT_TRANS_TABLES,就是导致auto_increament失败的mode,这个sql_mode主要用于 当一个值不能插入到表中是,则产生一个错误而不是一个警告并终止会话.解决办法:删除这个sql_mode.重启mysql.<br/>将 my.ini 中的<br/># Set the SQL mode to strict<br/>sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" <br/>改为：<br/><br/># Set the SQL mode to strict<br/>#sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"<br/>sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"<br/>Tags - <a href="http://yfyfj.cn/go.php/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item>
</channel>
</rss>