﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-老鱼的生活-文章分类-数据库</title><link>http://www.blogjava.net/kellyyu82/category/32405.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 19 Nov 2008 09:24:00 GMT</lastBuildDate><pubDate>Wed, 19 Nov 2008 09:24:00 GMT</pubDate><ttl>60</ttl><item><title>数据库的设计范式</title><link>http://www.blogjava.net/kellyyu82/articles/241425.html</link><dc:creator>老鱼吃猫</dc:creator><author>老鱼吃猫</author><pubDate>Wed, 19 Nov 2008 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/kellyyu82/articles/241425.html</guid><wfw:comment>http://www.blogjava.net/kellyyu82/comments/241425.html</wfw:comment><comments>http://www.blogjava.net/kellyyu82/articles/241425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kellyyu82/comments/commentRss/241425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kellyyu82/services/trackbacks/241425.html</trackback:ping><description><![CDATA[<p>引言<br />
<br />
　　数据库的设计范式是数据库设计所需要满足的规范，满足这些规范的数据库是简洁的、结构明晰的，同时，不会发生插入（insert）、删除（delete）和更新（update）操作异常。反之则是乱七八糟，不仅给数据库的编程人员制造麻烦，而且面目可憎，可能存储了大量不需要的冗余信息。<br />
<br />
　　设计范式是不是很难懂呢？非也，大学教材上给我们一堆数学公式我们当然看不懂，也记不住。所以我们很多人就根本不按照范式来设计数据库。<br />
<br />
　　实质上，设计范式用很形象、很简洁的话语就能说清楚，道明白。本文将对范式进行通俗地说明，并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。<br />
<br />
　　范式说明<br />
<br />
　　第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整型、实数、字符型、逻辑型、日期型等。<br />
<br />
　　例如，如下的数据库表是符合第一范式的：<br />
<br />
<table cellspacing="0" cellpadding="2" width="90%" align="center" border="1">
    <tbody>
        <tr>
            <td>字段1 </td>
            <td>字段2 </td>
            <td>字段3 </td>
            <td>字段4</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<br />
　　而这样的数据库表是不符合第一范式的：<br />
<br />
<table cellspacing="0" cellpadding="2" width="90%" align="center" border="1">
    <tbody>
        <tr>
            <td>字段1 </td>
            <td>字段2 </td>
            <td colspan="2">字段3 </td>
            <td>字段4</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>字段3.1</td>
            <td>字段3.2 </td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<p><br />
　　很显然，在当前的任何关系数据库管理系统（DBMS）中，傻瓜也不可能做出不符合第一范式的数据库，因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此，你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。<br />
<br />
　　第二范式（2NF）：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。
<table cellspacing="0" cellpadding="0" align="left" border="0">
    <tbody>
        <tr>
            <td valign="top">&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<br />
<br />
　　假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分)，关键字为组合关键字(学号, 课程名称)，因为存在如下决定关系：<br />
<br />
　　(学号, 课程名称) &#8594; (姓名, 年龄, 成绩, 学分)<br />
<br />
　　这个数据库表不满足第二范式，因为存在如下决定关系：<br />
<br />
　　(课程名称) &#8594; (学分)<br />
<br />
　　(学号) &#8594; (姓名, 年龄)<br />
<br />
　　即存在组合关键字中的字段决定非关键字的情况。<br />
<br />
　　由于不符合2NF，这个选课关系表会存在如下问题：<br />
<br />
　　(1) 数据冗余：<br />
<br />
　　同一门课程由n个学生选修，"学分"就重复n-1次；同一个学生选修了m门课程，姓名和年龄就重复了m-1次。<br />
<br />
　　(2) 更新异常：<br />
<br />
　　若调整了某门课程的学分，数据表中所有行的"学分"值都要更新，否则会出现同一门课程学分不同的情况。<br />
<br />
　　(3) 插入异常：<br />
<br />
　　假设要开设一门新的课程，暂时还没有人选修。这样，由于还没有"学号"关键字，课程名称和学分也无法记录入数据库。<br />
<br />
　　(4) 删除异常：<br />
<br />
　　假设一批学生已经完成课程的选修，这些选修记录就应该从数据库表中删除。但是，与此同时，课程名称和学分信息也被删除了。很显然，这也会导致插入异常。 <br />
<br />
　　把选课关系表SelectCourse改为如下三个表：<br />
<br />
　　学生：Student(学号, 姓名, 年龄)；<br />
<br />
　　课程：Course(课程名称, 学分)；<br />
<br />
　　选课关系：SelectCourse(学号, 课程名称, 成绩)。<br />
<br />
　　这样的数据库表是符合第二范式的，消除了数据冗余、更新异常、插入异常和删除异常。<br />
<br />
　　另外，所有单关键字的数据库表都符合第二范式，因为不可能存在组合关键字。<br />
<br />
　　第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在"A &#8594; B &#8594; C"的决定关系，则C传递函数依赖于A。因此，满足第三范式的数据库表应该不存在如下依赖关系：<br />
<br />
　　关键字段 &#8594; 非关键字段x &#8594; 非关键字段y<br />
<br />
　　假定学生关系表为Student(学号, 姓名, 年龄, 所在<a href="http://edu.itbulo.com/"><font color="#000000">学院</font></a>, <a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>地点, <a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>电话)，关键字为单一关键字"学号"，因为存在如下决定关系：<br />
<br />
　　(学号) &#8594; (姓名, 年龄, 所在<a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>, <a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>地点, <a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>电话)<br />
<br />
　　这个数据库是符合2NF的，但是不符合3NF，因为存在如下决定关系：<br />
<br />
　　(学号) &#8594; (所在<a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>) &#8594; (<a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>地点, <a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>电话)<br />
<br />
　　即存在非关键字段"<a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>地点"、"<a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>电话"对关键字段"学号"的传递函数依赖。<br />
<br />
　　它也会存在数据冗余、更新异常、插入异常和删除异常的情况，读者可自行分析得知。<br />
<br />
　　把学生关系表分为如下两个表：<br />
<br />
　　学生：(学号, 姓名, 年龄, 所在<a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>)；<br />
<br />
　　<a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>：(<a href="http://edu.itbulo.com/"><u><font color="#004a9c">学院</font></u></a>, 地点, 电话)。<br />
<br />
　　这样的数据库表是符合第三范式的，消除了数据冗余、更新异常、插入异常和删除异常。<br />
<br />
　　鲍依斯-科得范式（BCNF）：在第三范式的基础上，数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。</p>
<p>　假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)，且有一个管理员只在一个仓库工作；一个仓库可以存储多种物品。这个数据库表中存在如下决定关系：<br />
<br />
　　(仓库ID, 存储物品ID) &#8594;(管理员ID, 数量)<br />
<br />
　　(管理员ID, 存储物品ID) &#8594; (仓库ID, 数量)<br />
<br />
　　所以，(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字，表中的唯一非关键字段为数量，它是符合第三范式的。但是，由于存在如下决定关系：<br />
<br />
　　(仓库ID) &#8594; (管理员ID)<br />
<br />
　　(管理员ID) &#8594; (仓库ID)<br />
<br />
　　即存在关键字段决定关键字段的情况，所以其不符合BCNF范式。它会出现如下异常情况：<br />
<br />
　　(1) 删除异常：<br />
<br />
　　当仓库被清空后，所有"存储物品ID"和"数量"信息被删除的同时，"仓库ID"和"管理员ID"信息也被删除了。<br />
<br />
　　(2) 插入异常：<br />
<br />
　　当仓库没有存储任何物品时，无法给仓库分配管理员。<br />
<br />
　　(3) 更新异常：<br />
<br />
　　如果仓库换了管理员，则表中所有行的管理员ID都要修改。<br />
<br />
　　把仓库管理关系表分解为二个关系表：<br />
<br />
　　仓库管理：StorehouseManage(仓库ID, 管理员ID)；<br />
<br />
　　仓库：Storehouse(仓库ID, 存储物品ID, 数量)。<br />
<br />
　　这样的数据库表是符合BCNF范式的，消除了删除异常、插入异常和更新异常。 </p>
<p>&nbsp;</p>
<p>范式应用<br />
<br />
　　我们来逐步搞定一个论坛的数据库，有如下信息：<br />
<br />
　　（1） 用户：用户名，email，主页，电话，联系地址<br />
<br />
　　（2） 帖子：发帖标题，发帖内容，回复标题，回复内容 <br />
<br />
　　第一次我们将数据库设计为仅仅存在表：<br />
　　
<table cellspacing="0" cellpadding="2" width="90%" align="center" border="1">
    <tbody>
        <tr>
            <td>用户名 </td>
            <td>email </td>
            <td>主页</td>
            <td>电话</td>
            <td>联系地址</td>
            <td>发帖标题</td>
            <td>发帖内容</td>
            <td>回复标题</td>
            <td>回复内容</td>
        </tr>
    </tbody>
</table>
<br />
　　这个数据库表符合第一范式，但是没有任何一组候选关键字能决定数据库表的整行，唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段，即将表修改为：<br />
<br />
<table cellspacing="0" cellpadding="2" width="90%" align="center" border="1">
    <tbody>
        <tr>
            <td>用户名</td>
            <td>email</td>
            <td>主页</td>
            <td>电话</td>
            <td>联系地址</td>
            <td>发帖ID</td>
            <td>发帖标题</td>
            <td>发帖内容</td>
            <td>回复ID</td>
            <td>回复标题</td>
            <td>回复内容</td>
        </tr>
    </tbody>
</table>
<br />
　　这样数据表中的关键字(用户名，发帖ID，回复ID)能决定整行：<br />
<br />
　　(用户名,发帖ID,回复ID) &#8594; (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)<br />
<br />
　　但是，这样的设计不符合第二范式，因为存在如下决定关系：<br />
<br />
　　(用户名) &#8594; (email,主页,电话,联系地址)<br />
<br />
　　(发帖ID) &#8594; (发帖标题,发帖内容)<br />
<br />
　　(回复ID) &#8594; (回复标题,回复内容)<br />
<br />
　　即非关键字段部分函数依赖于候选关键字段，很明显，这个设计会导致大量的数据冗余和操作异常。
<table cellspacing="0" cellpadding="0" align="left" border="0">
    <tbody>
        <tr>
            <td valign="top">&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<br />
<br />
　　我们将数据库表分解为（带下划线的为关键字）：<br />
<br />
　　（1） 用户信息：用户名，email，主页，电话，联系地址<br />
<br />
　　（2） 帖子信息：发帖ID，标题，内容<br />
<br />
　　（3） 回复信息：回复ID，标题，内容<br />
<br />
　　（4） 发贴：用户名，发帖ID<br />
<br />
　　（5） 回复：发帖ID，回复ID<br />
<br />
　　这样的设计是满足第1、2、3范式和BCNF范式要求的，但是这样的设计是不是最好的呢？<br />
<br />
　　不一定。<br />
<br />
　　观察可知，第4项"发帖"中的"用户名"和"发帖ID"之间是1：N的关系，因此我们可以把"发帖"合并到第2项的"帖子信息"中；第5项"回复"中的"发帖ID"和"回复ID"之间也是1：N的关系，因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余，新的设计为：<br />
<br />
　　（1） 用户信息：用户名，email，主页，电话，联系地址<br />
<br />
　　（2） 帖子信息：用户名，发帖ID，标题，内容<br />
<br />
　　（3） 回复信息：发帖ID，回复ID，标题，内容<br />
<br />
　　数据库表1显然满足所有范式的要求；<br />
<br />
　　数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖，即不满足第二范式的要求，但是这一设计并不会导致数据冗余和操作异常；<br />
<br />
　　数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖，也不满足第二范式的要求，但是与数据库表2相似，这一设计也不会导致数据冗余和操作异常。<br />
<br />
　　由此可以看出，并不一定要强行满足范式的要求，对于1：N关系，当1的一边合并到N的那边后，N的那边就不再满足第二范式了，但是这种设计反而比较好！<br />
<br />
　　对于M：N的关系，不能将M一边或N一边合并到另一边去，这样会导致不符合范式要求，同时导致操作异常和数据冗余。 <br />
对于1：1的关系，我们可以将左边的1或者右边的1合并到另一边去，设计导致不符合范式要求，但是并不会导致操作异常和数据冗余。<br />
<br />
　　结论<br />
<br />
　　满足范式要求的数据库设计是结构清晰的，同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的，在数据库表中存在1：1或1：N关系这种较特殊的情况下，合并导致的不符合范式要求反而是合理的。<br />
<br />
　　在我们设计数据库的时候，一定要时刻考虑范式的要求。</p>
<img src ="http://www.blogjava.net/kellyyu82/aggbug/241425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kellyyu82/" target="_blank">老鱼吃猫</a> 2008-11-19 16:51 <a href="http://www.blogjava.net/kellyyu82/articles/241425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>完整性约束</title><link>http://www.blogjava.net/kellyyu82/articles/241415.html</link><dc:creator>老鱼吃猫</dc:creator><author>老鱼吃猫</author><pubDate>Wed, 19 Nov 2008 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/kellyyu82/articles/241415.html</guid><wfw:comment>http://www.blogjava.net/kellyyu82/comments/241415.html</wfw:comment><comments>http://www.blogjava.net/kellyyu82/articles/241415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kellyyu82/comments/commentRss/241415.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kellyyu82/services/trackbacks/241415.html</trackback:ping><description><![CDATA[<div class="postText">
<p><font face="Courier New"><strong>1 数据的完整性</strong><br />
&nbsp;约束是用来确保数据的准确性和一致性。数据的完整性就是对数据的准确性和一致性的一种保证。<br />
&nbsp;数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。<br />
分为以下四类：<br />
&nbsp;<strong>1 实体完整性</strong>：规定表的每一行在表中是惟一的实体。<br />
&nbsp;<strong>2 域完整性：</strong> 是指表中的列必须满足某种特定的数据类型约束，其中约束又包括取值范围、精度等规定。<br />
&nbsp;<strong>3 参照完整性</strong>： 是指两个表的主关键字和外关键字的数据应一致，保证了表之间的数据的一致性，防止了数据丢失或无意义的数据在数据库中扩散。<br />
&nbsp;<strong>4 用户定义的完整性</strong>： 不同的关系数据库系统根据其应用环境的不同，往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件，它反映某一具体应用必须满足的语义要求。<br />
<strong>2 完整性约束的类型：<br />
</strong>&nbsp;可分为三种类型：与表有关的约束、域(Domain)约束、断言(Assertion)&nbsp;<br />
&nbsp; <strong>1 与表有关的约束:</strong> 是表中定义的一种约束。可在列定义时定义该约束，此时称为列约束，也可以在表定义时定义约束，此时称为表约束。<br />
&nbsp; <strong>2 域(Domain)约束：</strong> 在域定义中被定义的一种约束，它与在特定域中定义的任何列都有关系。<br />
&nbsp;<strong> 3 断言(Assertion)：</strong>在断言定义时定义的一种约束，它可以与一个或多个表进行关联。<br />
&nbsp;<strong>一、 与表有关的约束：</strong>包括列约束(表约束+NOT NULL)和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。<br />
&nbsp; <strong>(1) not null（非空)约束：</strong>&nbsp;只用于定义列约束。<br />
&nbsp; &nbsp;&nbsp; 语法如下：<br />
&nbsp; &nbsp;&nbsp; Colunm_name datatype | domain not null<br />
&nbsp; &nbsp;&nbsp; 实例：<br />
&nbsp; &nbsp;&nbsp; create table Employee<br />
&nbsp; &nbsp;&nbsp;&nbsp; (<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_id int not null,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_name varchar(10) not null,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address varchar(40) ,<br />
&nbsp; &nbsp;&nbsp;&nbsp; )<br />
&nbsp; &nbsp;&nbsp; 创建之后，如果往表Employee表中非空约束中插入空值，insert into Employee values(1,null,'neimeng')将会出错。如下：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;Msg 515, Level 16, State 2, Line 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cannot insert the value NULL into column 'emp_name', table 'Student.dbo.Employee';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column does not allow nulls. INSERT fails.<br />
&nbsp;&nbsp;&nbsp;&nbsp;The statement has been terminated.</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;<strong>(2) unique(惟一)约束</strong>：用于指明创建惟一约束的列上的取值必须惟一。<br />
&nbsp;&nbsp;&nbsp;语法如下：<br />
&nbsp;&nbsp; Colunm_name datatype | domain unique<br />
&nbsp;&nbsp; 实例：<br />
&nbsp;&nbsp; create table EmployeeInfo<br />
&nbsp; &nbsp;&nbsp;&nbsp; (<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_id int not null,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_name varchar(10) not null,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phone&nbsp; char(11) unique,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address varchar(40) ,<br />
&nbsp; &nbsp;&nbsp;&nbsp; )<br />
&nbsp; &nbsp;&nbsp;&nbsp; 如下往EmployeeInfo插入数据时，如果两条记录的phone不惟一，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">insert into EmployeeInfo values(1,'abcdwxc','neimeng','13612345678')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into EmployeeInfo values(2,'terry','neimeng','13612345678')<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;则会出现错误。如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font face="Courier New">(1 row(s) affected)<br />
&nbsp;&nbsp;&nbsp;&nbsp; Msg 2627, Level 14, State 1, Line 2<br />
&nbsp;&nbsp;&nbsp;&nbsp; Violation of UNIQUE KEY constraint 'UQ__EmployeeInfo__060DEAE8'. Cannot insert duplicate key in object 'dbo.EmployeeInfo'.<br />
&nbsp;&nbsp;&nbsp;&nbsp; The statement has been terminated.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除了在定义列时添加unique约束外，也可以将unique约束作为表约束添加。即把它作为表定义的元素。<br />
&nbsp; &nbsp;&nbsp;&nbsp; 语法如下：<br />
&nbsp; &nbsp;&nbsp;&nbsp; [CONSTRAINT &nbsp;constraint_name] unique (column1,column2,.....)<br />
&nbsp; &nbsp;&nbsp;&nbsp; 实例：<br />
&nbsp; &nbsp;&nbsp;&nbsp; create table EmployeeInfo<br />
&nbsp; &nbsp;&nbsp;&nbsp; (<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_id int not null,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_name varchar(10) not null,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phone&nbsp; char(11) <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address varchar(40) ,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; constraint p_uniq unique(phone)<br />
&nbsp; &nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp; <strong>(3) primary key(主键)约束：</strong>用于定义基本表的主键，起惟一标识作用，其值不能为null,也不能重复，以此来保证实体的完整性。<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 语法如下：<br />
&nbsp; &nbsp;&nbsp;&nbsp; Colunm_name datatype | domain primary key<br />
&nbsp; &nbsp;&nbsp;&nbsp; 实例：&nbsp;&nbsp;&nbsp;</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;drop table EmployeeInfo</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; create table EmployeeInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_id int primary key,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_name varchar(10) not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phone&nbsp; char(11), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address varchar(40) , <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果向EmployeeInfo表插入的emp_id重复了或者插入时emp_id为null值，则会出错。<br />
&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; 可以在创建表时，创建主键约束，也可创建表完成以后，创建主键，例如：<br />
&nbsp; &nbsp;&nbsp;&nbsp; alter table EmployeeInfo<br />
&nbsp; &nbsp;&nbsp;&nbsp; add constraint e_prim primary key(emp_id)<br />
&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;primary key 与 unique的区别：<br />
&nbsp;&nbsp; &nbsp;&nbsp;1.在一个表中，只能定义一个primary key约束，但可定义多个unique约束。<br />
&nbsp;&nbsp; &nbsp;&nbsp;2.对于指定为primary key的一个列或多个列的组合，其中任何一个列都不能出现空值，而对于unique所约束的惟一键，则允许为null,只是null值最多有一个。<br />
&nbsp;&nbsp; <strong>(4) foreign key(外键)约束</strong>：定义了一个表中数据与另一个表中的数据的联系。<br />
&nbsp;&nbsp; &nbsp;&nbsp;foreign key约束指定某一个列或一组列作为外部键，其中包含外部键的表称为子表，包含外部键所引用的主键的表称为父表。系统保证，表在外部键上的取值要么是父表中某一主键，要么取空值，以此保证两个表之间的连接，确保了实体的参照完整性。<br />
&nbsp;&nbsp; &nbsp;&nbsp;语法如下：<br />
&nbsp;&nbsp; &nbsp;&nbsp;Colunm_name datetype | domain references table_name(column)<br />
&nbsp;&nbsp; &nbsp;&nbsp;[match full|partial|simple]&nbsp; //注：sqlserver不支持。<br />
&nbsp;&nbsp; &nbsp;&nbsp;[referential triggered action]<br />
&nbsp;&nbsp; &nbsp;&nbsp;说明：table_name为父表的表名，column为父表中与外键对应的主键值。<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[match full|partial|simple]为可选子句，用于设置如何处理外键中的null值。<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[referential triggered action]也为可选子句，用于设置更新、删除外键列时的操作准则。<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以为表的一列或多列创建foreign key 约束，如果为多列创建 foreign key约束，将分别与主表中的相应主键相对应。<br />
&nbsp;&nbsp; &nbsp;&nbsp;实例：<br />
&nbsp;&nbsp; &nbsp;&nbsp; create table EmployeeInfo<br />
&nbsp; &nbsp;&nbsp;&nbsp; (<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_id int primary key,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_name varchar(10) not null,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; account char(4) primary key,<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phone&nbsp; char(11) <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address varchar(40) , <br />
&nbsp; &nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp; &nbsp;&nbsp;create table Emp_Sal<br />
&nbsp;&nbsp;&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp_id int ,&nbsp;account CHAR(4) ,salary DECIMAL(5,1),<br />
&nbsp;&nbsp;&nbsp;CONSTRAINT E_SAL FOREIGN KEY(emp_id,account) REFERENCES EmployeeInfo (emp_id,account)) <br />
&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;也可以表创建以后添加到表上。如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;create table Emp_Sal<br />
&nbsp;&nbsp;&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp_id int ,emp_name varchar(10) not null,&nbsp;account CHAR(4) ,salary DECIMAL(5,1),&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;alter table Emp_Sal <br />
&nbsp;&nbsp;&nbsp;add CONSTRAINT E_SAL FOREIGN KEY(emp_id,account) REFERENCES EmployeeInfo (emp_id,account)<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;该外键的作用：确保表Emp_Sal的每个emp_id列都对应表EmployeeInfo中相应的emp_id。此时，表EmployeeInfo为父表，而表Emp_Sal为子表。子表的emp_id列参照父表的emp_id列。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果想在子表的emp_id列插入一个值，首先父表的emp_id列必须存在，否则会插入失败。如果想从父表的emp_id删除一个值，则必须无删除子表emp_id列中所有与之对应的值。<br />
&nbsp;&nbsp;&nbsp;(注:foreign key 列上的取值可以取null)。 <br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<strong>潜在问题</strong>：由于foreign key列上可以取空值,DBMS将跳过对foreign key约束的检查，因此如果插入Emp_Sal如下数据：<br />
&nbsp;&nbsp;&nbsp;insert into Emp_Sal values(6,null,null) 则插入到Emp_Sal中，但其主表的相关列却不存在。<br />
&nbsp;&nbsp;&nbsp;<strong>解决办法：</strong><br />
&nbsp;&nbsp;&nbsp; （1）将联合外键的列添加not null约束，但这限制了用户的部分操作。<br />
&nbsp;&nbsp;&nbsp; （2）采用Match子句。(sqlserver不支持).<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;<strong>更新、删除操作规则：</strong><br />
&nbsp;&nbsp;&nbsp;在删除或更新有primary key值的行，且该值与子表的foreign key中一个或多个值相匹配时，会引起匹配完整性的丧失。<br />
&nbsp;&nbsp;&nbsp;在foreign key创建语法中，提供了可选的on update和on delete子句，也就是上面的[referential triggered action]。可用此保持引用完整性。<br />
&nbsp;&nbsp;&nbsp;on update / on delete<br />
&nbsp;&nbsp;&nbsp;no action|cascade|restrict|set null|set default<br />
&nbsp;&nbsp;&nbsp;no action:更新或删除父表中的数据时，如果会使子表中的外键违反引用完整性，该动作将被禁止执行。不过在某些条件下，可出现暂时的，但在数据的最终状态中，不能违反外键的引用完整性。<br />
&nbsp;&nbsp;&nbsp;cascade: 当父表中被引用列的数据被更新或删除时，子表中的相应的数据也被更新或删除。<br />
&nbsp;&nbsp;&nbsp;restrict:与no action规则基本相同，只是引用列中的数据永远不能违反外键的引用完整性，暂时的也不行。<br />
&nbsp;&nbsp;&nbsp;set null:当父表数据被更新或删除时，子表中的相应数据被设置成Null值，前提是子表中的相应列允许null值。<br />
&nbsp;&nbsp;&nbsp;set default:当父表数据被更新或删除时,子表中的数据被设置成默认值。前提是子表中的相应列设置有默认值。<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;<strong>(5) check（校验）约束：</strong>用来检查字段值所允许的范围。DBMS每当执行delete,insert或update语句时，都对这个约束过滤。如果为true，则执行。否则，取消执行并提示错误。<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;列定义语法如下：<br />
&nbsp;&nbsp;&nbsp;Column datetype | domain check(search condition) <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;表约束语法如下：<br />
&nbsp;&nbsp;&nbsp;constraint constraint_name check(search condition)<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;实例如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;create table Emp_Sal<br />
&nbsp;&nbsp;&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp_id int ,&nbsp;account CHAR(4) ,salary DECIMAL(5,1),&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; constraint validsal check(salary &gt;=1000 and salary&lt;=10000)<br />
&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;如果此时，再往表中插入如下语句则会出错：(因为不满足salary大于等于1000的约束。)<br />
&nbsp;&nbsp;&nbsp;insert into Emp_Sal values(8,'12324343',800.0) <br />
&nbsp;<strong>二、 域约束：(</strong>sqlserver 不支持)<br />
&nbsp;&nbsp;&nbsp; 语法如下：<br />
&nbsp;&nbsp;&nbsp; create domain domain_name as data type<br />
&nbsp;&nbsp;&nbsp; [default default_value]<br />
&nbsp;&nbsp;&nbsp; [constraint constraint_name] check(value condition expression)<br />
&nbsp;&nbsp;&nbsp; 例如：<br />
&nbsp;&nbsp;&nbsp; create domain valid_no as int <br />
&nbsp;&nbsp;&nbsp; constraint constraint_no check(value between 100 and 999)<br />
&nbsp;&nbsp;&nbsp; 然后创建表时，使用valid_no域。<br />
&nbsp;&nbsp;&nbsp; create table TestDomain<br />
&nbsp;&nbsp;&nbsp; (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_id valid_no,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_name varchar(10),<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<strong>&nbsp;三、断言约束：</strong>不必与特定的列绑定，可以理解为能应用于多个表的check约束，因此必须在表定义之外独立创建断言。<br />
&nbsp;&nbsp;语法如下：<br />
&nbsp;&nbsp;create assertion constraint_name<br />
&nbsp;&nbsp;check search condition<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;例如：<br />
&nbsp;&nbsp;create assertion name<br />
&nbsp;&nbsp;check (Emp_Sal.emp_id in(select emp_id from EmployeeInfo where emp_name is not null)<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;添加断言后，每当试图添加或修改Emp_Sal表中的数据时，就对断言中的搜索条件求值，如果为false，则取消执行，给出提示。<br />
&nbsp;&nbsp; &nbsp;&nbsp;</font></p>
</div>
<img src ="http://www.blogjava.net/kellyyu82/aggbug/241415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kellyyu82/" target="_blank">老鱼吃猫</a> 2008-11-19 16:18 <a href="http://www.blogjava.net/kellyyu82/articles/241415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle常用傻瓜问题1000问 </title><link>http://www.blogjava.net/kellyyu82/articles/235932.html</link><dc:creator>老鱼吃猫</dc:creator><author>老鱼吃猫</author><pubDate>Wed, 22 Oct 2008 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/kellyyu82/articles/235932.html</guid><wfw:comment>http://www.blogjava.net/kellyyu82/comments/235932.html</wfw:comment><comments>http://www.blogjava.net/kellyyu82/articles/235932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kellyyu82/comments/commentRss/235932.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kellyyu82/services/trackbacks/235932.html</trackback:ping><description><![CDATA[  <img src ="http://www.blogjava.net/kellyyu82/aggbug/235932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kellyyu82/" target="_blank">老鱼吃猫</a> 2008-10-22 14:14 <a href="http://www.blogjava.net/kellyyu82/articles/235932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句</title><link>http://www.blogjava.net/kellyyu82/articles/209396.html</link><dc:creator>老鱼吃猫</dc:creator><author>老鱼吃猫</author><pubDate>Fri, 20 Jun 2008 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/kellyyu82/articles/209396.html</guid><wfw:comment>http://www.blogjava.net/kellyyu82/comments/209396.html</wfw:comment><comments>http://www.blogjava.net/kellyyu82/articles/209396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kellyyu82/comments/commentRss/209396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kellyyu82/services/trackbacks/209396.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">SQL语句先前写的时候，很容易把一些特殊的用法忘记，我特此整理了一下SQL语句操作。</p>
<p style="text-indent: 2em">一、基础</p>
<p style="text-indent: 2em">1、说明：创建数据库</p>
<p style="text-indent: 2em">CREATE DATABASE database-name </p>
<p style="text-indent: 2em">2、说明：删除数据库</p>
<p style="text-indent: 2em">drop database dbname</p>
<p style="text-indent: 2em">3、说明：备份sql server</p>
<p style="text-indent: 2em">--- 创建 <a href="http://www.51testing.com/javascrīpt:;">备份</a>数据的 device</p>
<p style="text-indent: 2em">USE master</p>
<p style="text-indent: 2em">EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'</p>
<p style="text-indent: 2em">--- 开始 备份</p>
<p style="text-indent: 2em">BACKUP DATABASE pubs TO testBack </p>
<p style="text-indent: 2em">4、说明：创建新表</p>
<p style="text-indent: 2em">create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)</p>
<p style="text-indent: 2em">根据已有的表创建新表： </p>
<p style="text-indent: 2em">A：create table tab_new like tab_old (使用旧表创建新表)</p>
<p style="text-indent: 2em">B：create table tab_new as select col1,col2... from tab_old definition only</p>
<p style="text-indent: 2em">5、说明：删除新表</p>
<p style="text-indent: 2em">drop table tabname </p>
<p style="text-indent: 2em">6、说明：增加一个列</p>
<p style="text-indent: 2em">Alter table tabname add column col type</p>
<p style="text-indent: 2em">注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。</p>
<p style="text-indent: 2em">7、说明：添加主键： Alter table tabname add primary key(col) </p>
<p style="text-indent: 2em">说明：删除主键： Alter table tabname drop primary key(col) </p>
<p style="text-indent: 2em">8、说明：创建索引：create [unique] index idxname on tabname(col....) </p>
<p style="text-indent: 2em">删除索引：drop index idxname</p>
<p style="text-indent: 2em">注：索引是不可更改的，想更改必须删除重新建。</p>
<p style="text-indent: 2em">9、说明：创建视图：create view viewname as select statement </p>
<p style="text-indent: 2em">删除视图：drop view viewname</p>
<p style="text-indent: 2em">10、说明：几个简单的基本的sql语句</p>
<p style="text-indent: 2em">选择：select * from table1 where 范围</p>
<p style="text-indent: 2em">插入：insert into table1(field1,field2) values(value1,value2)</p>
<p style="text-indent: 2em">删除：delete from table1 where 范围</p>
<p style="text-indent: 2em">更新：update table1 set field1=value1 where 范围</p>
<p style="text-indent: 2em">查找：select * from table1 where field1 like '%value1%' ---like的语法很精妙，查资料!</p>
<p style="text-indent: 2em">排序：select * from table1 order by field1,field2 [desc]</p>
<p style="text-indent: 2em">总数：select count as totalcount from table1</p>
<p style="text-indent: 2em">求和：select sum(field1) as sumvalue from table1</p>
<p style="text-indent: 2em">平均：select avg(field1) as avgvalue from table1</p>
<p style="text-indent: 2em">最大：select max(field1) as maxvalue from table1</p>
<p style="text-indent: 2em">最小：select min(field1) as minvalue from table1</p>
<p style="text-indent: 2em">11、说明：几个高级查询运算词</p>
<p style="text-indent: 2em">A： UNION 运算符 </p>
<p style="text-indent: 2em">UNION 运算符通过组合<a href="http://www.51testing.com/javascrīpt:;">其他</a>两个结果表（例如 TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 </p>
<p style="text-indent: 2em">B： EXCEPT 运算符 </p>
<p style="text-indent: 2em">EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。 </p>
<p style="text-indent: 2em">C： INTERSECT 运算符</p>
<p style="text-indent: 2em">INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。 </p>
<p style="text-indent: 2em">注：使用运算词的几个查询结果行必须是一致的。 </p>
<p style="text-indent: 2em">12、说明：使用外连接 </p>
<p style="text-indent: 2em">A、left outer join： </p>
<p style="text-indent: 2em">左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。 </p>
<p style="text-indent: 2em">SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c</p>
<p style="text-indent: 2em">B：right outer join: </p>
<p style="text-indent: 2em">右外连接(右连接)：结果集既包括连接表的匹配连接行，也包括右连接表的所有行。 </p>
<p style="text-indent: 2em">C：full outer join： </p>
<p style="text-indent: 2em">全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。</p>
<p style="text-indent: 2em">二、提升</p>
<p style="text-indent: 2em">1、说明：复制表(只复制结构,源表名：a 新表名：b) (Access可用)</p>
<p style="text-indent: 2em">法一：select * into b from a where 1&lt;&gt;1</p>
<p style="text-indent: 2em">法二：select top 0 * into b from a</p>
<p style="text-indent: 2em">2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用)</p>
<p style="text-indent: 2em">insert into b(a, b, c) select d,e,f from b;</p>
<p style="text-indent: 2em">3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)</p>
<p style="text-indent: 2em">insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件</p>
<p style="text-indent: 2em">例子：..from b in '"&amp;Server.MapPath(".")&amp;"\data.mdb" &amp;"' where..</p>
<p style="text-indent: 2em">4、说明：子查询(表名1：a 表名2：b)</p>
<p style="text-indent: 2em">select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)</p>
<p style="text-indent: 2em">5、说明：显示文章、提交人和最后回复时间</p>
<p style="text-indent: 2em">select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b</p>
<p style="text-indent: 2em">6、说明：外连接查询(表名1：a 表名2：b)</p>
<p style="text-indent: 2em">select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c</p>
<p style="text-indent: 2em">7、说明：在线视图查询(表名1：a )</p>
<p style="text-indent: 2em">select * from (SELECT a,b,c FROM a) T where t.a &gt; 1;</p>
<p style="text-indent: 2em">8、说明：between的用法,between限制查询数据范围时包括了边界值,not between不包括</p>
<p style="text-indent: 2em">select * from table1 where time between time1 and time2</p>
<p style="text-indent: 2em">select a,b,c, from table1 where a not between 数值1 and 数值2</p>
<p style="text-indent: 2em">9、说明：in 的使用方法</p>
<p style="text-indent: 2em">select * from table1 where a [not] in ('值1','值2','值4','值6')</p>
<p style="text-indent: 2em">10、说明：两张关联表，删除主表中已经在副表中没有的信息 </p>
<p style="text-indent: 2em">delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )</p>
<p style="text-indent: 2em">11、说明：四表联查问题：</p>
<p style="text-indent: 2em">select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....</p>
<p style="text-indent: 2em">12、说明：日程安排提前五分钟提醒 </p>
<p style="text-indent: 2em">SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&gt;5</p>
<p style="text-indent: 2em">13、说明：一条sql 语句搞定数据库分页</p>
<p style="text-indent: 2em">select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段</p>
<p style="text-indent: 2em">14、说明：前10条记录</p>
<p style="text-indent: 2em">select top 10 * form table1 where 范围</p>
<p style="text-indent: 2em">15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)</p>
<p style="text-indent: 2em">select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)</p>
<p style="text-indent: 2em">16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表</p>
<p style="text-indent: 2em">(select a from tableA ) except (select a from tableB) except (select a from tableC)</p>
<p style="text-indent: 2em">17、说明：随机取出10条数据</p>
<p style="text-indent: 2em">select top 10 * from tablename order by newid()</p>
<p style="text-indent: 2em">18、说明：随机选择记录</p>
<p style="text-indent: 2em">select newid()</p>
<p style="text-indent: 2em">19、说明：删除重复记录</p>
<p style="text-indent: 2em">Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)</p>
<p style="text-indent: 2em">20、说明：列出数据库里所有的表名</p>
<p style="text-indent: 2em">select name from sysobjects where type='U' </p>
<p style="text-indent: 2em">21、说明：列出表里的所有的</p>
<p style="text-indent: 2em">select name from syscolumns where id=object_id('TableName')</p>
<p style="text-indent: 2em">22、说明：列示type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似select 中的case。</p>
<p style="text-indent: 2em">select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type</p>
<p style="text-indent: 2em">显示结果：</p>
<p style="text-indent: 2em">type vender pcs</p>
<p style="text-indent: 2em">电脑 A 1</p>
<p style="text-indent: 2em">电脑 A 1</p>
<p style="text-indent: 2em">光盘 B 2</p>
<p style="text-indent: 2em">光盘 A 2</p>
<p style="text-indent: 2em">手机 B 3</p>
<p style="text-indent: 2em">手机 C 3</p>
<p style="text-indent: 2em">23、说明：初始化表table1</p>
<p style="text-indent: 2em">TRUNCATE TABLE table1</p>
<p style="text-indent: 2em">24、说明：选择从10到15的记录</p>
<p style="text-indent: 2em">select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc</p>
<p style="text-indent: 2em">三、技巧</p>
<p style="text-indent: 2em">1、1=1，1=2的使用，在SQL语句组合时用的较多</p>
<p style="text-indent: 2em">"where 1=1" 是表示选择全部&nbsp;&nbsp; "where 1=2"全部不选，</p>
<p style="text-indent: 2em">如：</p>
<p style="text-indent: 2em">if @strWhere !='' </p>
<p style="text-indent: 2em">begin</p>
<p style="text-indent: 2em">set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere </p>
<p style="text-indent: 2em">end</p>
<p style="text-indent: 2em">else </p>
<p style="text-indent: 2em">begin</p>
<p style="text-indent: 2em">set @strSQL = 'select count(*) as Total from [' + @tblName + ']' </p>
<p style="text-indent: 2em">end </p>
<p style="text-indent: 2em">我们可以直接写成</p>
<p style="text-indent: 2em">set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere </p>
<p style="text-indent: 2em">2、收缩数据库</p>
<p style="text-indent: 2em">--重建索引</p>
<p style="text-indent: 2em">DBCC REINDEX</p>
<p style="text-indent: 2em">DBCC INDEXDEFRAG</p>
<p style="text-indent: 2em">--收缩数据和日志</p>
<p style="text-indent: 2em">DBCC SHRINKDB</p>
<p style="text-indent: 2em">DBCC SHRINKFILE</p>
<p style="text-indent: 2em">3、压缩数据库</p>
<p style="text-indent: 2em">dbcc shrinkdatabase(dbname)</p>
<p style="text-indent: 2em">4、转移数据库给新用户以已存在用户权限</p>
<p style="text-indent: 2em">exec sp_change_users_login 'update_one','newname','oldname'</p>
<p style="text-indent: 2em">go</p>
<p style="text-indent: 2em">5、检查备份集</p>
<p style="text-indent: 2em">RESTORE VERIFYONLY from disk='E:\dvbbs.bak'</p>
<p style="text-indent: 2em">6、修复数据库</p>
<p style="text-indent: 2em">ALTER DATABASE [dvbbs] SET SINGLE_USER</p>
<p style="text-indent: 2em">GO</p>
<p style="text-indent: 2em">DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK</p>
<p style="text-indent: 2em">GO</p>
<p style="text-indent: 2em">ALTER DATABASE [dvbbs] SET MULTI_USER</p>
<p style="text-indent: 2em">GO</p>
<p style="text-indent: 2em">7、日志清除</p>
<p style="text-indent: 2em">SET NOCOUNT ON</p>
<p style="text-indent: 2em">DECLARE @LogicalFileName sysname,</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @MaxMinutes INT,</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @NewSize INT </p>
<p style="text-indent: 2em">USE&nbsp;&nbsp;&nbsp;&nbsp; tablename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 要操作的数据库名</p>
<p style="text-indent: 2em">SELECT&nbsp; @LogicalFileName = 'tablename_log',&nbsp; -- 日志文件名</p>
<p style="text-indent: 2em">@MaxMinutes = 10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Limit on time allowed to wrap log.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @NewSize = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 你想设定的日志文件的大小(M)</p>
<p style="text-indent: 2em">-- Setup / initialize</p>
<p style="text-indent: 2em">DECLARE @OriginalSize int</p>
<p style="text-indent: 2em">SELECT @OriginalSize = size </p>
<p style="text-indent: 2em">&nbsp; FROM sysfiles</p>
<p style="text-indent: 2em">&nbsp; WHERE name = @LogicalFileName</p>
<p style="text-indent: 2em">SELECT 'Original Size of ' + db_name() + ' LOG is ' + </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'</p>
<p style="text-indent: 2em">&nbsp; FROM sysfiles</p>
<p style="text-indent: 2em">&nbsp; WHERE name = @LogicalFileName</p>
<p style="text-indent: 2em">CREATE TABLE DummyTrans</p>
<p style="text-indent: 2em">&nbsp; (DummyColumn char (8000) not null)</p>
<p style="text-indent: 2em">DECLARE @Counter&nbsp;&nbsp; INT,</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @StartTime DATETIME,</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @TruncLog&nbsp; VARCHAR(255)</p>
<p style="text-indent: 2em">SELECT&nbsp; @StartTime = GETDATE(),</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'</p>
<p style="text-indent: 2em">DBCC SHRINKFILE (@LogicalFileName, @NewSize)</p>
<p style="text-indent: 2em">EXEC (@TruncLog)</p>
<p style="text-indent: 2em">-- Wrap the log if necessary.</p>
<p style="text-indent: 2em">WHILE&nbsp;&nbsp;&nbsp;&nbsp; @MaxMinutes &gt; DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)&nbsp; </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND (@OriginalSize * 8 /1024) &gt; @NewSize&nbsp; </p>
<p style="text-indent: 2em">&nbsp; BEGIN -- Outer loop.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; SELECT @Counter = 0</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; WHILE&nbsp; ((@Counter &lt; @OriginalSize / 16) AND (@Counter &lt; 50000))</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN -- update</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT DummyTrans VALUES ('Fill Log')&nbsp; </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DELETE DummyTrans</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT @Counter = @Counter + 1</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;&nbsp; </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; EXEC (@TruncLog)&nbsp; </p>
<p style="text-indent: 2em">&nbsp; END&nbsp;&nbsp; </p>
<p style="text-indent: 2em">SELECT 'Final Size of ' + db_name() + ' LOG is ' +</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT(VARCHAR(30),size) + ' 8K pages or ' + </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'</p>
<p style="text-indent: 2em">&nbsp; FROM sysfiles </p>
<p style="text-indent: 2em">&nbsp; WHERE name = @LogicalFileName</p>
<p style="text-indent: 2em">DROP TABLE DummyTrans</p>
<p style="text-indent: 2em">SET NOCOUNT OFF </p>
<p style="text-indent: 2em">8、说明：更改某个表</p>
<p style="text-indent: 2em">exec sp_changeobjectowner 'tablename','dbo'</p>
<p style="text-indent: 2em">9、存储更改全部表</p>
<p style="text-indent: 2em">CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch</p>
<p style="text-indent: 2em">&nbsp;@OldOwner as NVARCHAR(128),</p>
<p style="text-indent: 2em">&nbsp;@NewOwner as NVARCHAR(128)</p>
<p style="text-indent: 2em">AS</p>
<p style="text-indent: 2em">DECLARE @Name&nbsp;&nbsp; as NVARCHAR(128)</p>
<p style="text-indent: 2em">DECLARE @Owner&nbsp; as NVARCHAR(128)</p>
<p style="text-indent: 2em">DECLARE @OwnerName&nbsp; as NVARCHAR(128)</p>
<p style="text-indent: 2em">DECLARE curObject CURSOR FOR </p>
<p style="text-indent: 2em">&nbsp;select 'Name'&nbsp;&nbsp; = name,</p>
<p style="text-indent: 2em">&nbsp; 'Owner'&nbsp;&nbsp; = user_name(uid)</p>
<p style="text-indent: 2em">&nbsp;from sysobjects</p>
<p style="text-indent: 2em">&nbsp;where user_name(uid)=@OldOwner</p>
<p style="text-indent: 2em">&nbsp;order by name</p>
<p style="text-indent: 2em">OPEN&nbsp; curObject</p>
<p style="text-indent: 2em">FETCH NEXT FROM curObject INTO @Name, @Owner</p>
<p style="text-indent: 2em">WHILE(@@FETCH_STATUS=0)</p>
<p style="text-indent: 2em">BEGIN&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 2em">&nbsp;if @Owner=@OldOwner </p>
<p style="text-indent: 2em">&nbsp;begin</p>
<p style="text-indent: 2em">&nbsp; set @OwnerName = @OldOwner + '.' + rtrim(@Name)</p>
<p style="text-indent: 2em">&nbsp; exec sp_changeobjectowner @OwnerName, @NewOwner</p>
<p style="text-indent: 2em">&nbsp;end</p>
<p style="text-indent: 2em">-- select @name,@NewOwner,@OldOwner</p>
<p style="text-indent: 2em">&nbsp;FETCH NEXT FROM curObject INTO @Name, @Owner</p>
<p style="text-indent: 2em">END</p>
<p style="text-indent: 2em">close curObject</p>
<p style="text-indent: 2em">deallocate curObject</p>
<p style="text-indent: 2em">GO</p>
<p style="text-indent: 2em">10、SQL SERVER中直接循环写入数据</p>
<p style="text-indent: 2em">declare @i int</p>
<p style="text-indent: 2em">set @i=1</p>
<p style="text-indent: 2em">while @i&lt;30</p>
<p style="text-indent: 2em">begin</p>
<p style="text-indent: 2em">&nbsp;&nbsp; insert into <a href="http://www.51testing.com/javascrīpt:;">test</a> (userid) values(@i)</p>
<p style="text-indent: 2em">&nbsp;&nbsp; set @i=@i+1</p>
<p style="text-indent: 2em">end</p>
<p style="text-indent: 2em">小记存储过程中经常用到的本周，本月，本年函数 </p>
<p style="text-indent: 2em">Dateadd(wk,datediff(wk,0,getdate()),-1) </p>
<p style="text-indent: 2em">Dateadd(wk,datediff(wk,0,getdate()),6) </p>
<p style="text-indent: 2em">Dateadd(mm,datediff(mm,0,getdate()),0) </p>
<p style="text-indent: 2em">Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) </p>
<p style="text-indent: 2em">Dateadd(yy,datediff(yy,0,getdate()),0) </p>
<p style="text-indent: 2em">Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) </p>
<p style="text-indent: 2em">上面的SQL代码只是一个时间段 </p>
<p style="text-indent: 2em">Dateadd(wk,datediff(wk,0,getdate()),-1) </p>
<p style="text-indent: 2em">Dateadd(wk,datediff(wk,0,getdate()),6) </p>
<p style="text-indent: 2em">就是表示本周时间段. </p>
<p style="text-indent: 2em">下面的SQL的条件部分,就是查询时间段在本周范围内的: </p>
<p style="text-indent: 2em">Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) </p>
<p style="text-indent: 2em">而在存储过程中 </p>
<p style="text-indent: 2em">select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) </p>
<p style="text-indent: 2em">select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)</p>
<img src ="http://www.blogjava.net/kellyyu82/aggbug/209396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kellyyu82/" target="_blank">老鱼吃猫</a> 2008-06-20 11:33 <a href="http://www.blogjava.net/kellyyu82/articles/209396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 9i标量数据类型</title><link>http://www.blogjava.net/kellyyu82/articles/209372.html</link><dc:creator>老鱼吃猫</dc:creator><author>老鱼吃猫</author><pubDate>Fri, 20 Jun 2008 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/kellyyu82/articles/209372.html</guid><wfw:comment>http://www.blogjava.net/kellyyu82/comments/209372.html</wfw:comment><comments>http://www.blogjava.net/kellyyu82/articles/209372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kellyyu82/comments/commentRss/209372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kellyyu82/services/trackbacks/209372.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">Oracle 9i共提供了16种标量数据类型，</p>
<p style="text-indent: 2em">Oracle 9i的标量数据类型名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;含义<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;用于描述定长的字符型数据，长度&lt;=2000字节 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用于描述变长的字符型数据，长度&lt;=4000字节 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nchar&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来存储Unicode字符集的定长字符型数据，长度&lt;=1000字节 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nvarchar2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来存储Unicode字符集的变长字符型数据，长度&lt;=1000字节<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来存储整型或者浮点型数值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来存储日期数据 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来存储最大长度为2GB的变长字符数据 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Raw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来存储非结构化数据的变长字符数据，长度&lt;=2000字节<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Long raw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来存储非结构化数据的变长字符数据，长度&lt;=2GB <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rowid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来存储表中列的物理地址的二进制数据，占用固定的10个字节 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Blob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来存储多达4GB的非结构化的二进制数据 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Clob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来存储多达4GB的字符数据 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nclob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来存储多达4GB的Unicode字符数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来把非结构化的二进制数据存储在数据库以外的操作系统文件中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;urowid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来存储表示任何类型列地址的二进制数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来存储浮点数&nbsp;&nbsp; </p>
 <img src ="http://www.blogjava.net/kellyyu82/aggbug/209372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kellyyu82/" target="_blank">老鱼吃猫</a> 2008-06-20 11:18 <a href="http://www.blogjava.net/kellyyu82/articles/209372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>