会员名称:  密码:   验证码:     会员注册  忘记密码? 
设为首页
加入收藏
返回首页
媒体资讯>> 业界资讯 - 会展动态 - 竞赛&活动 - IT互联网  媒体学院>> 图形图像 - 网页制作 - 网络编程 - 数据库 - 服务器 - 网络应用  作品赏析>> 视频音响 - CG动画 - UI设计 - 平面设计 - 网页设计 - 摄影映象 - 三维2D - 其它设计  媒体工作室>> 视频影像 - 音频声响 - 三维2D - 平面视觉 - 软硬技术 - 摄影映象  人物访谈>> 人物访谈 - 华夏新锐  媒体杂志>> 媒体杂志  素材图库>> 丽景佳图 - 设计素材 - 资料图库 - 矢量图库 - 动态动画 - 特色图标  酷站赏析>> 韩国网站 - 国外网站 - 国内网站  会员中心>> 会员注册 - 会员登陆
当前位置:华夏媒体 - > 媒体学院 - > 数据库 - > MYSQL - > MySQL数据库技术(08)
   
   
   
MySQL数据库技术(08) MySQL数据库技...  [MYSQ...]
More... 
   
网络协议X档案全集(十) 网络协议X档案...  [其它...]
不可忽视的BIOS参数设置 不可忽视的BIO...  [其它...]
微软IE浏览器非常规修改全攻略(上) 微软IE浏览器非...  [其它...]
微软IE浏览器非常规修改全攻略(下) 微软IE浏览器非...  [其它...]
网管十招 网管十招  [其它...]
微软安全问题 源自OS和IE中集成RSS 微软安全问题 ...  [其它...]
修改注册表使电脑更安全 修改注册表使电...  [其它...]
利用注册表管理IP地址 利用注册表管理...  [其它...]
有关IIS HACK的一些方法整理 有关IIS HACK的...  [其它...]
More 
MySQL数据库技术(08)
编辑:华夏媒体     作者:未知     来源:网络     时间:2006-07-29     总浏览量:2165
文字大小:[      ]     文字颜色:      双击滚屏/单击停止

[上一页] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [下一页] 


    如果使用的是3 . 2 3以上的版本,怎样保持严格的增量序列?方法之一是保持一个只用来生成A U TO_INCREMENT 值的独立的表,永远不从这个表中删除记录。在这种情况下,独立表中的值永远不会重用。在主表中需要生成一个新记录时,首先在序列编号表中插入一个N U L L。然后对希望包含序列编号的列使用L A S T _ I N S E RT_ID( ) 的值将该记录插入主表,如下所示:

    如果想要编写一个生成A U TO_INCREMENT 值的应用程序,但希望序列从100 而不是1开始。再假定希望这个程序可移植到所有MySQL 版本。怎样来完成它呢?如果可移植是一个目标,那么不能依赖MySQL 3.23 所提供的在C R E ATE TABLE 语句中指定初始序列编号的功能。而是在想要插入一个记录时,首先用下列语句检查表是否是空的:

    这个步骤虽然是附加的,但不会花费太多的时间,因为没有WHERE 子句的SELECT COUNT(*) 是优化的,返回很快。如果表是空的,则插入记录并明确地对序列编号列指定值1 0 0。如果表不空,则对序列编号列值指定NULL 使MySQL 自动生成下一个编号。此方法允许插入序列编号为1 0 0、101 等的记录,它不管MySQL 是否允许指定初始序列值都能正常工作。如果要求序列编号即使是从表中删除了记录后也要严格递增,则此方法不起作用。在这样的情形下,可将此方法与前面描述的什么也不做只是用来产生用于主表的序列编号的辅助表技术结合使用。为什么会希望从一个大于1 的序列编号开始呢?一个原因是想使所有序列编号全都具有相同的数字位数。如果需要生成顾客ID 号,并且希望不要多于一百万个顾客,则可以从1 000 000
开始编号。在对顾客ID 值计数的数字位数改变之前,可以追加一百万个顾客。当然,强制序列编号为一个固定宽度的另一个方法是采用ZEROFILL 列。对于有的情形,这样做有可能会出问题。例如,如果在Perl 或PHP 脚本中处理具有前导零的序列编号,则必须仔细地将它们只作为串使用;如果将它们转换成数字,前导零将会丢失。下面的短Perl 脚本说明了处理编号时可能会出的问题:

    打印时,此脚本给出下列输出:

    P e r l’s‘+ +’自动增量操作是很灵巧的而且可以利用串或数值建立序列值,但‘+ =’操作只应用于数值。在所显示的输出中,可看到‘ + =’引起串到数值的转换并且丢失了$s 值中的前导零。
    序列不从1开始的另一个原因从技术的角度来说可能不值一提。例如,在分配会员号时,序列号不要从1开始,以免出现关于谁是第一号的政治争论。
    (4) 不用A U TO_INCREMENT 生成序列生成序列号的另一个方法根本就不需要使用A U TO_INCREMENT 列。它利用取一个参数的L A S T _ I N S E RT_ID( ) 函数的变量来生成序列号。(这种形式在MySQL 3.22.9. 中引入)如果利用L A S T _ I N S E RT_ID(expr) 来插入或更新一个列, 则下一次不用参数调用L A S T _ I N S E RT_ID( ) 时,将返回expr 的值。换句话说,就像由A U TO_INCREMENT 机制生成的那样对expr 进行处理。这样使得能生成一个序列号,然后可在以后的客户会话中利用它,用不着取受其他客户机影响的值。利用这种策略的一种方法是创建一个包含一个值的单行表,该值在想得到序列中下一个值时进行更新。例如,可创建如下的表:

    上面的语句创建了表seq_table 并用包含seq 值0 的行对其进行初始化。可利用这个表产生下一个序列号,如下所示:

    该语句取出seq 列的当前值并对其加1,产生序列中的下一个值。利用L A S T _ I N S E RT _ID(seq + 1) 生成新值使它就像一个AUTO_INCREMENT 值一样,而且此值可在以后的语句中通过调用无参数的L A S T _ I N S E RT_ID( ) 来取出。即使某个其他客户机同时生成了另一个序列号,上述作用也不会改变,因为L A S T _ I N S E RT_ID( ) 是客户机专用的。如果希望生成增量不是1 的编号序列或负增量的编号序列,也可以利用这个方法。例如,下面两个语句可以用来分别生成一个增量为100 的编号序列和一个负的编号序列:

    通过将seq 列设置为相应的初始值,可利用这个方法生成以任意值开始的序列。关于将此序列生成方法用于多个计数器的应用,可参阅第3章。
    2.2.3 串列类型
    MySQL 提供了几种存放字符数据的串类型。串常常用于如下这样的值:

    在某种意义上,串实际是一种“通用”类型,因为可用它们来表示任意值。例如,可用串类型来存储二进制数据,如影像或声音,或者存储gzip 的输出结果,即存储压缩数据。对于所有串类型,都要剪裁过长的值使其适合于相应的串类型。但是串类型的取值范围很不同,有的取值范围很小,有的则很大。取值大的串类型能够存储近4GB 的数据。因此,应该使串足够长以免您的信息被切断(由于受客户机/服务器通信协议的最大块尺寸限制,列


[上一页] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [下一页] 

打印   收藏   关闭   至顶部  


关于我们 | 联系我们 | 合作伙伴 | 站点地图 | 免责声明 | 版权声明 | 意见建议
版权所有  Copyright © 2005-2006 华夏媒体(Media86.Com). All Rights Reserved .
网站备案号:粤ICP备06055307号