﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Mike's blog-文章分类-Database</title><link>http://www.cppblog.com/wolf/category/6279.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 05 Feb 2013 00:44:11 GMT</lastBuildDate><pubDate>Tue, 05 Feb 2013 00:44:11 GMT</pubDate><ttl>60</ttl><item><title>数据库事务的属性－ACID</title><link>http://www.cppblog.com/wolf/articles/121626.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Fri, 30 Jul 2010 07:53:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/121626.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/121626.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/121626.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/121626.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/121626.html</trackback:ping><description><![CDATA[<p><span><span>1</span></span><span><span>、数据库事务的属性－</span></span><span><span>ACID</span></span><span><span>（四个英文单词的首写字母）：</span></span><span></span></p>
<p><span><span>1</span></span><span><span>）原子性（</span></span><span><span>Atomicity</span></span><span><span>）</span></span><span></span></p>
<p><span><span>所谓原子性就是将一组操作作为一个操作单元，是原子操作，即要么全部执行，要么全部不执行。</span></span></p>
<p><span><span>2</span></span><span><span>）一致性（</span></span><span><span>Consistency</span></span><span><span>）</span></span><span></span></p>
<p><span><span>事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。</span></span><span><span>如果事务成功地完成，那么系统中所有变化将正确地应用，系统处于有效状态。如果在事务中出现错误，那么系统中的所有变化将自动地回滚，系统返回到原始状态。</span></span><span></span></p>
<p><span><span>3</span></span><span><span>）隔离性（</span></span><span><span>Isolation</span></span><span><span>）</span></span><span></span></p>
<p><span><span>隔离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来，不被其它企图进行修改的事务看到。</span></span><span></span></p>
<p><span><span>4</span></span><span><span>）持久性（</span></span><span><span>Durability</span></span><span><span>）</span></span><span></span></p>
<p><span><span>持久性是指一个事务一旦被提交，它对数据库中数据的改变就是永久性的，接下来的其他操作和数据库故障不应该对其有任何影响</span></span></span><span><span>。即一旦一个事务提交，</span></span><span><span>DBMS</span></span><span><span>（</span></span><span><span>Database Management System</span></span><span><span>）</span></span><span><span>保证它对数据库中数据的改变应该是永久性的，持久性通过数据库备份和恢复来保证。</span></span><span></span></p>
<p>&nbsp;</p>
<p><span>2</span><span>、在关系型数据库中，事务的隔离性分为四个隔离级别，在解读这四个级别前先介绍几个关于读数据的概念。</span></p>
<p><span>1</span><span>）</span><span>脏读（</span><span>Dirty Reads</span><span>）：所谓脏读就是对脏数据（</span><span>Drity Data</span><span>）的读取，而脏数据所指的就是未提交的数据。也就是说，一个事务正在对一条记录做修改，在这个事务完成并提交之前，这条数据是处于待定状态的（可能提交也可能回滚），这时，第二个事务来读取这条没有提交的数据，并据此做进一步的处理，就会产生未提交的数据依赖关系。这种现象被称为脏读。</span></p>
<p><span>2</span><span>）不可重复读（</span><span>Non-Repeatable Reads</span><span>）：</span><span><span>一个事务先后读取同一条记录，但两次读取的数据不同，我们称之为不可重复读</span>。也就是说，这个事务在两次读取之间该数据被其它事务所修改。</span></span></p>
<p><span>3</span><span>）幻读（</span><span>Phantom Reads</span><span>）：一个事务按相同的查询条件重新读取以前检索过的数据，却发现其他事务插入了满足其查询条件的新数据，这种现象就称为幻读。</span></p>
<p><span>&nbsp;</span></p>
<p><span><span>3</span></span><span><span>、事务四个隔离级别对比：</span></span><span></span></p>
<p><span><span>1</span></span><span><span>）未提交读（</span></span><span><span>Read Uncommitted</span></span><span><span>）：</span></span><span>SELECT</span><span>语句以非锁定方式被执行，所以有可能读到脏数据，隔离级别最低。</span><span></span></p>
<p><span><span>2</span></span><span><span>）提交读（</span></span><span><span>Read Committed</span></span></span></span><span><span>）：只能读取到已经提交的数据。</span></span>即解决了脏读，但未解决不可重复读。</span></span><span></span></p>
<p><span><span>3</span></span><span><span>）可重复读（</span></span><span><span>Repeated Read</span></span><span><span>）：在同一个事务内的查询都是事务开始时刻一致的，</span></span><span><span>InnoDB</span></span><span><span>的默认级别。在</span></span><span><span>SQL</span></span><span><span>标准中，该隔离级别消除了不可重复读，但是还存在幻读</span></span>。</span></span><span></span></p>
<p><span><span>4</span></span><span><span>）串行读（</span></span><span><span>Serializable</span></span><span><span>）：完全的串行化读，</span></span><span>所有</span><span>SELECT</span><span>语句都被隐式的转换成</span><span>SELECT ... LOCK IN SHARE MODE</span><span>，即</span><span><span>读取使用表级共享锁，读写相互都会阻塞</span></span>。隔离级别最高。</span></span></p>
<br>
<p><span>隔离级别对比表：<br><img height=166 alt="" src="http://www.cppblog.com/images/cppblog_com/wolf/table.JPG" width=589 border=0><br><br></p>
<p><span>4</span><span>、事务隔离级别的设置：</span></p>
<p><span>1</span><span>）服务启动选项</span><code><span>--transaction-isolation</span></code><code><span>或在配置文件中设置：</span></code></p>
<pre><span>[mysqld]</span></pre>
<pre><span>transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>| REPEATABLE-READ | SERIALIZABLE}</span></pre>
<p><span>2</span><span>）服务启动后的设置：</span></p>
<p align=left><span>SET</span><span> [<span>GLOBAL</span> | <span>SESSION</span>] <span>TRANSACTION</span> <span>ISOLATION</span> <span>LEVEL</span></span></p>
<p align=left><span>{ <span>READ</span> <span>UNCOMMITTED</span> | <span>READ</span> <span>COMMITTED</span> | <span>REPEATABLE</span> <span>READ</span> | <span>SERIALIZABLE</span> }</span></p>
</span>
<img src ="http://www.cppblog.com/wolf/aggbug/121626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2010-07-30 15:53 <a href="http://www.cppblog.com/wolf/articles/121626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL存储过程技术总结。</title><link>http://www.cppblog.com/wolf/articles/83054.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Fri, 15 May 2009 07:44:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/83054.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/83054.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/83054.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/83054.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/83054.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MYSQL存储过程和自定义函数可统称为数据库存储例程，因为实际应用中存储过程更为常用，而自定义函数语法与存储过程差别不是很大，所以本文档主要介绍存储过程。主要涉及内容：<br><br>1.存储过程的概念<br>2.为什么使用存储过程<br>3.基本创建、删除语法<br>4.存储过程中的变量<br>5.BEGIN...END复合语句<br>6.流程控制结构语句<br>7.注释语法<br>8.使用权限<br>9.条件和异常处理程序<br>10.游标<br><br><a title=MYSQL存储过程技术总结下载 style="COLOR: #0000ff" href="http://www.cppblog.com/Files/wolf/PROCEDURE.rar">MYSQL存储过程技术总结下载</a>
<img src ="http://www.cppblog.com/wolf/aggbug/83054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2009-05-15 15:44 <a href="http://www.cppblog.com/wolf/articles/83054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL数据库的备份</title><link>http://www.cppblog.com/wolf/articles/77731.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Tue, 24 Mar 2009 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/77731.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/77731.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/77731.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/77731.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/77731.html</trackback:ping><description><![CDATA[<p><br>1.冷备份<br>在数据库处于非运行状态时通过直接拷贝数据文件或目录的方式进行备份。<br>2.热备份<br>1).将数据库设置为只读状态:<br>mysql&gt;flush tables with read lock;<br>该语句的作用是：刷新缓冲区，对于所有带读取锁定的数据库，关闭所有打开的表，并锁定所有的表，直到执行UNLOCK TABLES为止。<br>注意：在备份完成之前当前会话的连接不可退出，否则自动解锁。<br>2).使用mysqldump导出或直接拷贝数据文件。<br>mysqldump [options] [db_name [tbl_name ...]]<br>最简单的导出就是：<br>shell&gt;mysqldump db_name &gt; db_back.sql<br>常用选项有：<br>--quick: 该选项对导出大表非常有用。如果不带该选项，mysqldump将在导出结果前装载整个结果集到内存中，对于正在导出一个大的数据库，这将可能是一个问题。使用该选项后，它将强迫mysqldump从服务器以一次一行的方式检索而不做缓冲，直接输出。<br>--disable-keys：告诉 mysqldump 在 Insert 语句的开头和结尾增加 /*!40000 Alter TABLE table DISABLE KEYS */; 和 /*!40000 Alter TABLE table ENABLE KEYS */; 语句，这能大大提高插入语句的速度，因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。<br>--add-drop-table：在每个create语句之前增加一个drop table语句。<br>--add-locks：在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE(为了使得更快地插入到MySQL)。<br>--extended-insert：使用可以包括多个values列表的多行INSERT语法(可以加快插入速度)。<br>--lock-tables：在导出前先锁定所有表。如果是MyISAM表，将通过READ LOCAL的形式被锁定以支持并发插入，对InnoDB和BDB类型表不会有效果。<br>--opt：等同于--quick --add-drop-table --add-locks --extended-insert --lock-tables<br>--quick和--opt选项默认打开，可以通过--skip-opt选项来关闭。<br>更多选项请参考手册。</p>
<p>3).取消数据库的只读状态：<br>mysql&gt;unlock tables;</p>
<img src ="http://www.cppblog.com/wolf/aggbug/77731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2009-03-24 15:39 <a href="http://www.cppblog.com/wolf/articles/77731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL外键(Foreign Key)的使用</title><link>http://www.cppblog.com/wolf/articles/69089.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Wed, 10 Dec 2008 10:06:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/69089.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/69089.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/69089.html#Feedback</comments><slash:comments>29</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/69089.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/69089.html</trackback:ping><description><![CDATA[<p>在MySQL 3.23.44版本后，InnoDB引擎类型的表支持了外键约束。<br>外键的使用条件：<br>1.两个表必须是InnoDB表，MyISAM表暂时不支持外键（据说以后的版本有可能支持，但至少目前不支持）；<br>2.外键列必须建立了索引，MySQL 4.1.2以后的版本在建立外键时会自动创建索引，但如果在较早的版本则需要显示建立； <br>3.外键关系的两个表的列必须是数据类型相似，也就是可以相互转换类型的列，比如int和tinyint可以，而int和char则不可以； </p>
<p>外键的好处：可以使得两张表关联，保证数据的一致性和实现一些级联操作；</p>
<p>外键的定义语法：<br>[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)<br>&nbsp;&nbsp;&nbsp; REFERENCES tbl_name (index_col_name, ...)<br>&nbsp;&nbsp;&nbsp; [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]<br>&nbsp;&nbsp;&nbsp; [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]<br>该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用，如果不指定CONSTRAINT symbol，MYSQL会自动生成一个名字。<br>ON DELETE、ON UPDATE表示事件触发限制，可设参数：<br>RESTRICT（限制外表中的外键改动）<br>CASCADE（跟随外键改动）<br>SET NULL（设空值）<br>SET DEFAULT（设默认值）<br>NO ACTION（无动作，默认的）</p>
<p>搞个例子，简单演示一下使用，做dage和xiaodi两个表，大哥表是主键，小弟表是外键：<br>建表：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">CREATE</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">TABLE</span><span style="COLOR: #000000">&nbsp;`dage`&nbsp;(<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;`id`&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">11</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">&nbsp;auto_increment,<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;`name`&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">varchar</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">32</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #ff0000">''</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">PRIMARY</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000">&nbsp;&nbsp;(`id`)<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>)&nbsp;ENGINE</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">InnoDB&nbsp;</span><span style="COLOR: #0000ff">DEFAULT</span><span style="COLOR: #000000">&nbsp;CHARSET</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">latin1；<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">CREATE</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">TABLE</span><span style="COLOR: #000000">&nbsp;`xiaodi`&nbsp;(<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;`id`&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">11</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">&nbsp;auto_increment,<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;`dage_id`&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">11</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;`name`&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">varchar</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">32</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #ff0000">''</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">PRIMARY</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000">&nbsp;&nbsp;(`id`),<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000">&nbsp;`dage_id`&nbsp;(`dage_id`),<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">CONSTRAINT</span><span style="COLOR: #000000">&nbsp;`xiaodi_ibfk_1`&nbsp;</span><span style="COLOR: #0000ff">FOREIGN</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000">&nbsp;(`dage_id`)&nbsp;</span><span style="COLOR: #0000ff">REFERENCES</span><span style="COLOR: #000000">&nbsp;`dage`&nbsp;(`id`)<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>)&nbsp;ENGINE</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">InnoDB&nbsp;</span><span style="COLOR: #0000ff">DEFAULT</span><span style="COLOR: #000000">&nbsp;CHARSET</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">latin1；</span></div>
<br>插入个大哥：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000">&nbsp;dage(name)&nbsp;</span><span style="COLOR: #0000ff">values</span><span style="COLOR: #000000">(</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">铜锣湾</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Query&nbsp;OK,&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;row&nbsp;affected&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0.01</span><span style="COLOR: #000000">&nbsp;sec)<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;dage;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">+</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">--+--------+</span><span style="COLOR: #008080"><br></span><span style="COLOR: #008080">5</span><span style="COLOR: #008080"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;id&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;name&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">+</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">--+--------+</span><span style="COLOR: #008080"><br></span><span style="COLOR: #008080">7</span><span style="COLOR: #008080"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;铜锣湾&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">+</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">--+--------+</span><span style="COLOR: #008080"><br></span><span style="COLOR: #008080">9</span><span style="COLOR: #008080"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;row&nbsp;</span><span style="COLOR: #808080">in</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0.00</span><span style="COLOR: #000000">&nbsp;sec)</span></div>
<br>插入个小弟：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000">&nbsp;xiaodi(dage_id,name)&nbsp;</span><span style="COLOR: #0000ff">values</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">铜锣湾_小弟A</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Query&nbsp;OK,&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;row&nbsp;affected&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0.02</span><span style="COLOR: #000000">&nbsp;sec)<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;xiaodi;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">+</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">--+---------+--------------+</span><span style="COLOR: #008080"><br></span><span style="COLOR: #008080">6</span><span style="COLOR: #008080"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;id&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;dage_id&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">+</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">--+---------+--------------+</span><span style="COLOR: #008080"><br></span><span style="COLOR: #008080">8</span><span style="COLOR: #008080"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000">&nbsp;铜锣湾_小弟A&nbsp;</span><span style="COLOR: #808080">|</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #808080">+</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">--+---------+--------------+</span></div>
<br>把大哥删除：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">delete</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;dage&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;id</span><span style="COLOR: #808080">=</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ERROR&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1451</span><span style="COLOR: #000000">&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">23000</span><span style="COLOR: #000000">):&nbsp;Cannot&nbsp;</span><span style="COLOR: #0000ff">delete</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">or</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">update</span><span style="COLOR: #000000">&nbsp;a&nbsp;parent&nbsp;row:&nbsp;a&nbsp;</span><span style="COLOR: #0000ff">foreign</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">constraint</span><span style="COLOR: #000000">&nbsp;fails&nbsp;(`bstar</span><span style="COLOR: #808080">/</span><span style="COLOR: #000000">xiaodi`,&nbsp;</span><span style="COLOR: #0000ff">CONSTRAINT</span><span style="COLOR: #000000">&nbsp;`xiaodi_ibfk_1`&nbsp;</span><span style="COLOR: #0000ff">FOREIGN</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000">&nbsp;(`dage_id`)&nbsp;</span><span style="COLOR: #0000ff">REFERENCES</span><span style="COLOR: #000000">&nbsp;`dage`&nbsp;(`id`))</span></div>
<p><br>提示：不行呀，有约束的，大哥下面还有小弟，可不能扔下我们不管呀！</p>
<p>插入一个新的小弟：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000">&nbsp;xiaodi(dage_id,name)&nbsp;</span><span style="COLOR: #0000ff">values</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">旺角_小弟A</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ERROR&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1452</span><span style="COLOR: #000000">&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">23000</span><span style="COLOR: #000000">):&nbsp;Cannot&nbsp;</span><span style="COLOR: #0000ff">add</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">or</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">update</span><span style="COLOR: #000000">&nbsp;a&nbsp;child&nbsp;row:&nbsp;a&nbsp;</span><span style="COLOR: #0000ff">foreign</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">constraint</span><span style="COLOR: #000000">&nbsp;fails&nbsp;(`bstar</span><span style="COLOR: #808080">/</span><span style="COLOR: #000000">xiaodi`,&nbsp;</span><span style="COLOR: #0000ff">CONSTRAINT</span><span style="COLOR: #000000">&nbsp;`xiaodi_ibfk_1`&nbsp;</span><span style="COLOR: #0000ff">FOREIGN</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000">&nbsp;(`dage_id`)&nbsp;</span><span style="COLOR: #0000ff">REFERENCES</span><span style="COLOR: #000000">&nbsp;`dage`&nbsp;(`id`))<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>提示：小子，想造反呀！你还没大哥呢！</p>
<p>把外键约束增加事件触发限制：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;show&nbsp;</span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000">&nbsp;xiaodi;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">CONSTRAINT</span><span style="COLOR: #000000">&nbsp;`xiaodi_ibfk_1`&nbsp;</span><span style="COLOR: #0000ff">FOREIGN</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000">&nbsp;(`dage_id`)&nbsp;</span><span style="COLOR: #0000ff">REFERENCES</span><span style="COLOR: #000000">&nbsp;`dage`&nbsp;(`id`)<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">alter</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000">&nbsp;xiaodi&nbsp;</span><span style="COLOR: #0000ff">drop</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">foreign</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000">&nbsp;xiaodi_ibfk_1;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Query&nbsp;OK,&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;row&nbsp;affected&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0.04</span><span style="COLOR: #000000">&nbsp;sec)<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Records:&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;&nbsp;Duplicates:&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0</span><span style="COLOR: #000000">&nbsp;&nbsp;Warnings:&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">alter</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000">&nbsp;xiaodi&nbsp;</span><span style="COLOR: #0000ff">add</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">foreign</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000">(dage_id)&nbsp;</span><span style="COLOR: #0000ff">references</span><span style="COLOR: #000000">&nbsp;dage(id)&nbsp;</span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">delete</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">cascade</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">update</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">cascade</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Query&nbsp;OK,&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;row&nbsp;affected&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0.04</span><span style="COLOR: #000000">&nbsp;sec)<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Records:&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;&nbsp;Duplicates:&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0</span><span style="COLOR: #000000">&nbsp;&nbsp;Warnings:&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0</span></div>
<br>再次试着把大哥删了：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">delete</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;dage&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;id</span><span style="COLOR: #808080">=</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Query&nbsp;OK,&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;row&nbsp;affected&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0.01</span><span style="COLOR: #000000">&nbsp;sec)<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;dage;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Empty&nbsp;</span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0.01</span><span style="COLOR: #000000">&nbsp;sec)<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>mysql</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;xiaodi;<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Empty&nbsp;</span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0.00</span><span style="COLOR: #000000">&nbsp;sec)</span></div>
<p><br><br>得，这回对应的小弟也没了，没办法，谁让你跟我on delete cascade了呢！</p>
<p>例子说明的应该蛮清楚了吧，其他功能对应手册自己实践吧！:-)</p>
<img src ="http://www.cppblog.com/wolf/aggbug/69089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-12-10 18:06 <a href="http://www.cppblog.com/wolf/articles/69089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL日志文件</title><link>http://www.cppblog.com/wolf/articles/67224.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Tue, 18 Nov 2008 09:28:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/67224.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/67224.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/67224.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/67224.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/67224.html</trackback:ping><description><![CDATA[
<p>MYSQL有不同类型的日志文件(各自存储了不同类型的日志)，从它们当中可以查询到MYSQL里都做了些什么，对于MYSQL的管理工作，这些日志文件是不可缺少的。<br>1.错误日志(The error log)：记录了数据库启动、运行以及停止过程中错误信息；<br>2.ISAM操作日志(The isam log)：记录了所有对ISAM表的修改，该日志仅仅用于调试ISAM模式；<br>3.SQL执行日志(The query log)：记录了客户端的连接以及所执行的SQL语句；<br>4.更新日志(The update log)：记录了改变数据的语句，已经不建议使用，由二进制日志替代；<br>5.二进制日志(The binary log)：记录了所有对数据库数据的修改语句；<br>6.超时日志(The slow log)：记录所有执行时间超过最大SQL执行时间(long_query_time)或未使用索引的语句；</p>
<p>如果你是在用mysql的复制、备份功能，那么从服务器还提供了一种叫做relay log的日志文件。</p>
<p>默认情况下所有日志文件会记录在MYSQL的数据目录下，你可以通过强制mysql去关闭并重新打开一个文件进行日志记录，当然系统会自动加后缀(如.00001, .00002)，方式有在mysql环境下执行语句 mysql&gt;flush logs; 或者通过mysqladmin管理程序执行 #mysqladmin flush-logs 或 #mysqladmin refresh</p>
<p>这些日志的启动方式可以在mysqld_safe方式启动数据库的时候，后面跟选项参数，也可以在配置文件里配置，推荐采用第二种方式，配置方法很简单，我只配置了三种日志：<br><br>[mysqld]<br>log=/var/log/mysqld_common.log<br>log-error=/var/log/mysqld_err.log<br>log-bin=/var/log/mysqld_bin.bin</p>
<p><br>日志的查看很简单，大部分都是文本，直接用vim、less、more之类的工具看就可以了，值得说明的是二进制文件的查看：</p>
<p>1). 首先确定是否开启了二进制文件记录功能<br>mysql&gt;show variables like 'log_bin';</p>
<p>2). 如果你想知道现在记录二进制数据的文件具体信息，你可以通过下列语句看到现在正在记录哪个文件，以及记录的当前位置：<br>mysql&gt;show master status;</p>
<p>3). 查看二进制数据需要借助程序mysqlbinlog，看看它支持哪些选项，根据自己需要来使用。<br>mysql&gt;mysqlbinlog /var/log/mysql/mysql-bin.000040;<br>查询某个时间范围的可以执行下列语句，如果记录很多可以将结果定向到一个文件里自己慢慢看:-) ：<br>mysql&gt;mysqlbinlog --start-datetime='2008-01-01 00:00:00' --stop-datetime='2008-08-08 00:00:00'&nbsp; /var/log/mysql/mysql-bin.000040 &gt; ./tmp.log<br></p><img src ="http://www.cppblog.com/wolf/aggbug/67224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-11-18 17:28 <a href="http://www.cppblog.com/wolf/articles/67224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL EXPLAIN句法(得到关于SELECT的信息)</title><link>http://www.cppblog.com/wolf/articles/43467.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Fri, 29 Feb 2008 06:43:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/43467.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/43467.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/43467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/43467.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/43467.html</trackback:ping><description><![CDATA[<p>&nbsp;EXPLAIN tbl_name<br>or EXPLAIN SELECT select_options<br><br>EXPLAIN tbl_name是DESCRIBE tbl_name或SHOW COLUMNS FROM tbl_name的一个同义词。 <br><br>当你在一条SELECT语句前放上关键词EXPLAIN，MySQL解释它将如何处理SELECT，提供有关表如何联结和以什么次序联结的信息。 <br><br>借助于EXPLAIN，你可以知道你什么时候必须为表加入索引以得到一个使用索引找到记录的更快的SELECT。你也能知道优化器是否以一个最佳次序联结表。为了强制优化器对一个SELECT语句使用一个特定联结次序，增加一个STRAIGHT_JOIN子句。 <br><br>对于非简单的联结，EXPLAIN为用于SELECT语句中的每个表返回一行信息。表以他们将被读入的顺序被列出。MySQL用一边扫描多次联结的方式解决所有联结，这意味着MySQL从第一个表中读一行，然后找到在第二个表中的一个匹配行，然后在第3个表中等等。当所有的表被处理完，它输出选择的列并且回溯表列表直到找到一个表有更多的匹配行，从该表读入下一行并继续处理下一个表。 <br><br>从EXPLAIN的输出包括下面列： <br><br>table <br>输出的行所引用的表。 <br>type <br>联结类型。各种类型的信息在下面给出。 <br>possible_keys <br>possible_keys列指出MySQL能使用哪个索引在该表中找到行。注意，该列完全独立于表的次序。这意味着在possible_keys中的某些键实际上不能以生成的表次序使用。如果该列是空的，没有相关的索引。在这种情况下，你也许能通过检验WHERE子句看是否它引用某些列或列不是适合索引来提高你的查询性能。如果是这样，创造一个适当的索引并且在用EXPLAIN检查查询。见7.8 ALTER TABLE句法。为了看清一张表有什么索引，使用SHOW INDEX FROM tbl_name。 <br>key <br>key列显示MySQL实际决定使用的键。如果没有索引被选择，键是NULL。 <br>key_len <br>key_len列显示MySQL决定使用的键长度。如果键是NULL，长度是NULL。注意这告诉我们MySQL将实际使用一个多部键值的几个部分。 <br>ref <br>ref列显示哪个列或常数与key一起用于从表中选择行。 <br>rows <br>rows列显示MySQL相信它必须检验以执行查询的行数。 <br>Extra <br>如果Extra列包括文字Only index，这意味着信息只用索引树中的信息检索出的。通常，这比扫描整个表要快。如果Extra列包括文字where used，它意味着一个WHERE子句将被用来限制哪些行与下一个表匹配或发向客户。 <br>不同的联结类型列在下面，以最好到最差类型的次序： <br><br>system <br>表仅有一行(=系统表)。这是const联结类型的一个特例。 <br>const <br>表有最多一个匹配行，它将在查询开始时被读取。因为仅有一行，在这行的列值可被剩下的优化器认为是常数。 const表很快，因为它们只读取一次！ <br>eq_ref <br>对于每个来自于先前的表的行组合，从该表中读取一行。这可能是最好的联结类型，除了const类型。它用在一个索引的所有部分被联结使用并且索引是UNIQUE或PRIMARY KEY。 <br>ref <br>对于每个来自于先前的表的行组合，所有有匹配索引值的行将从这张表中读取。如果联结只使用键的最左面前缀，或如果键不是UNIQUE或PRIMARY KEY（换句话说，如果联结不能基于键值选择单个行的话)，使用ref。如果被使用的键仅仅匹配一些行，该联结类型是不错的。 <br>range <br>只有在一个给定范围的行将被检索，使用一个索引选择行。ref列显示哪个索引被使用。 <br>index <br>这与ALL相同，除了只有索引树被扫描。这通常比ALL快，因为索引文件通常比数据文件小。 <br>ALL <br>对于每个来自于先前的表的行组合，将要做一个完整的表扫描。如果表格是第一个没标记const的表，这通常不好，并且通常在所有的其他情况下很差。你通常可以通过增加更多的索引来避免ALL，使得行能从早先的表中基于常数值或列值被检索出。 <br>通过相乘EXPLAIN输出的rows行的所有值，你能得到一个关于一个联结要多好的提示。这应该粗略地告诉你MySQL必须检验多少行以执行查询。当你使用max_join_size变量限制查询时，也用这个数字。见10.2.3 调节服务器参数。 <br><br>下列例子显示出一个JOIN如何能使用EXPLAIN提供的信息逐步被优化。 <br><br>假定你有显示在下面的SELECT语句，你使用EXPLAIN检验： <br><br>EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,<br>tt.ProjectReference, tt.EstimatedShipDate,<br>tt.ActualShipDate, tt.ClientID,<br>tt.ServiceCodes, tt.RepetitiveID,<br>tt.CurrentProcess, tt.CurrentDPPerson,<br>tt.RecordVolume, tt.DPPrinted, et.COUNTRY,<br>et_1.COUNTRY, do.CUSTNAME<br>FROM tt, et, et AS et_1, do<br>WHERE tt.SubmitTime IS NULL<br>AND tt.ActualPC = et.EMPLOYID<br>AND tt.AssignedPC = et_1.EMPLOYID<br>AND tt.ClientID = do.CUSTNMBR;<br><br>对于这个例子，假定： <br><br>被比较的列被声明如下： 表 列 列类型 <br>tt ActualPC CHAR(10) <br>tt AssignedPC CHAR(10) <br>tt ClientID CHAR(10) <br>et EMPLOYID CHAR(15) <br>do CUSTNMBR CHAR(15) <br><br>表有显示在下面的索引： 表 索引 <br>tt ActualPC <br>tt AssignedPC <br>tt ClientID <br>et EMPLOYID（主键） <br>do CUSTNMBR（主键） <br><br>tt.ActualPC值不是均匀分布的。 <br>开始，在任何优化被施行前，EXPLAIN语句产生下列信息： <br><br>table type possible_keys key key_len ref rows Extra<br>et ALL PRIMARY NULL NULL NULL 74<br>do ALL PRIMARY NULL NULL NULL 2135<br>et_1 ALL PRIMARY NULL NULL NULL 74<br>tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872<br>range checked for each record (key map: 35)<br><br>因为type对每张表是ALL，这个输出显示MySQL正在对所有表进行一个完整联结！这将花相当长的时间，因为必须检验每张表的行数的乘积次数！对于一个实例，这是74 * 2135 * 74 * 3872 = 45,268,558,720行。如果表更大，你只能想象它将花多长时间&#8230;&#8230; <br><br>如果列声明不同，这里的一个问题是MySQL(还)不能高效地在列上使用索引。在本文中，VARCHAR和CHAR是相同的，除非他们声明为不同的长度。因为tt.ActualPC被声明为CHAR(10)并且et.EMPLOYID被声明为CHAR(15)，有一个长度失配。 <br><br>为了修正在列长度上的不同，使用ALTER TABLE将ActualPC的长度从10个字符变为15个字符：<br><br>mysql&gt; ALTER TABLE tt MODIFY ActualPC VARCHAR(15);<br><br>现在tt.ActualPC和et.EMPLOYID都是VARCHAR(15)，再执行EXPLAIN语句产生这个结果： <br><br>table type possible_keys key key_len ref rows Extra<br>tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used<br>do ALL PRIMARY NULL NULL NULL 2135<br>range checked for each record (key map: 1)<br>et_1 ALL PRIMARY NULL NULL NULL 74<br>range checked for each record (key map: 1)<br>et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1<br><br>这不是完美的，但是是好一些了(rows值的乘积少了一个74一个因子)，这个版本在几秒内执行。 <br><br>第2种改变能消除tt.AssignedPC = et_1.EMPLOYID和tt.ClientID = do.CUSTNMBR比较的列的长度失配：<br><br>mysql&gt; ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),<br>MODIFY ClientID VARCHAR(15);<br><br>现在EXPLAIN产生的输出显示在下面： <br><br>table type possible_keys key key_len ref rows Extra<br>et ALL PRIMARY NULL NULL NULL 74<br>tt ref AssignedPC,ClientID,ActualPC ActualPC 15 et.EMPLOYID 52 where used<br>et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1<br>do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1<br><br>这&#8220;几乎&#8221;象它能得到的一样好。 <br><br>剩下的问题是，缺省地，MySQL假设在tt.ActualPC列的值是均匀分布的，并且对tt表不是这样。幸好，很容易告诉MySQL关于这些： <br><br>shell&gt; myisamchk --analyze PATH_TO_MYSQL_DATABASE/tt<br>shell&gt; mysqladmin refresh<br><br>现在联结是&#8220;完美&#8221;的了，而且EXPLAIN产生这个结果： <br><br>table type possible_keys key key_len ref rows Extra<br>tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used<br>et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1<br>et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1<br>do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1<br><br>注意在从EXPLAIN输出的rows列是一个来自MySQL联结优化器的&#8220;教育猜测&#8221;；为了优化查询，你应该检查数字是否接近事实。如果不是，你可以通过在你的SELECT语句里面使用STRAIGHT_JOIN并且试着在在FROM子句以不同的次序列出表，可能得到更好的性能。<br></p>
<p>转载：<a href="http://www.99net.net/doc/database/1076488199/1076552137.html">http://www.99net.net/doc/database/1076488199/1076552137.html</a></p>
<img src ="http://www.cppblog.com/wolf/aggbug/43467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-02-29 14:43 <a href="http://www.cppblog.com/wolf/articles/43467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>